真实在2000万行表上对比多线程和单线程GROUP BY的耗时差异,诚实报告加速比,并结合本系列已验证的机制说明聚合快的真实根本原因。
代码CREATE TABLE demo.aggtest (k UInt64, cat UInt8, v Float64) ENGINE=MergeTree ORDER BY k; INSERT INTO demo.aggtest SELECT number, number%100, number*1.5 FROM numbers(20000000); SELECT cat, sum(v), count() FROM demo.aggtest GROUP BY cat; -- 默认多线程 SELECT cat, sum(v) FROM demo.aggtest GROUP BY cat SETTINGS max_threads=1; -- 强制单线程
默认多线程(max_threads=auto(10)):真实46~100毫秒(3次运行:0.10s/0.08s/0.08s) 强制单线程(max_threads=1) :真实130~230毫秒(3次运行:0.13s/0.23s/0.14s) 真实加速比:约1.5~2倍(远不到理论上的10倍线性加速)
多线程真实带来了加速,但远没有达到核心数(10核)对应的理论线性加速——这条GROUP BY本身要处理的数据量和计算量,在2000万行、100个分类这个规模下已经足够小,线程调度、各线程结果的最终合并这些真实的固定开销,占比反而变得不可忽视。
每一步都是本文上面用真实计时跑出来的原始结果。
max_threads=auto(10) 与 max_threads=1