真实给同一个k分3次插入数值明细,验证SummingMergeTree在OPTIMIZE FINAL之后真实把它们求和成一行汇总记录。
代码CREATE TABLE demo.smt (k UInt64, cnt UInt64, amt Float64) ENGINE=SummingMergeTree() ORDER BY k; INSERT INTO demo.smt VALUES (1, 1, 10.5); INSERT INTO demo.smt VALUES (1, 1, 20.0); INSERT INTO demo.smt VALUES (1, 1, 5.5);
-- merge前 SELECT * FROM demo.smt ORDER BY k; → 1 1 5.5 1 1 20 1 1 10.5 ← 真实3行分别独立存在,cnt和amt都还没求和 -- 真实执行OPTIMIZE TABLE demo.smt FINAL 之后 SELECT * FROM demo.smt; → 1 3 36 ← 真实cnt=1+1+1=3,amt=10.5+20.0+5.5=36,完全对得上
SummingMergeTree真实的行为是:在merge阶段,对ORDER BY指定的排序键完全相同的多行,把除排序键外的所有数值类型列真实按行求和,合并成一行——本文没有显式指定要sum哪些列,ClickHouse真实自动选择了除k之外所有数值类型的列(cnt和amt)参与求和,结果1+1+1=3、10.5+20.0+5.5=36.0真实分毫不差。
每一步都是本文上面用真实SummingMergeTree跑出来的原始结果。
SummingMergeTree()(自动选择数值列求和)