ClickHouse通过SummingMergeTree来支持对主键列进行预聚合。在后台合并时,会将主键相同的多行进行sum求和,然后使用一行数据取而代之,从而大幅度降低存储空间占用,提升聚合计算性能。
ClickHouse只在后台Compaction时才会进行数据的预先聚合,而compaction的执行时机无法预测,所以可能会存在一部分数据已经被预先聚合,但仍有一部分数据尚未被聚合的情况。
因此在执行聚合计算时,SQL中仍需要使用GROUP BY子句来保证sum的准确。
在预聚合时,ClickHouse会对主键列以外的其他所有列进行预聚合。但这些列必须是数值类型才会计算sum(当sum结果为0时会删除此行数据);如果是String等不可聚合的类型,则随机选择一个值。
通常建议将SummingMergeTree与MergeTree配合使用,使用MergeTree来存储明细数据,使用SummingMergeTree存储预聚合的数据来支撑加速查询。
语法结构
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = SummingMergeTree([columns])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
SummingMergeTree参数说明 |
---|
SummingMergeTree([columns])中的[columns]参数是表中的列,是可选的,该列是要汇总值的列名称的元组。这些列必须是数字类型,并且不能在主键中。如果不指定该列参数,ClickHouse会使用数值数据类型汇总所有非主键列的sum值 |
create table tbl_test_summingmergetree(
key UInt64,
value UInt64
) engine=SummingMergeTree() order by key;
insert into tbl_test_summingmergetree(key,value) values(1,13);
select * from tbl_test_summingmergetree;
insert into tbl_test_summingmergetree(key,value) values(1,13);
select * from tbl_test_summingmergetree;
insert into tbl_test_summingmergetree(key,value) values(1,16);
select * from tbl_test_summingmergetree;
sum函数用于计算value的和,count函数用于查看插入次数,group by用于保证是否合并完成都是准确的计算sum
select key,sum(value),count(value) from tbl_test_summingmergetree group by key;
optimize table tbl_test_summingmergetree final;
select key,sum(value),count(value) from tbl_test_summingmergetree group by key;
结果集中key=1的count值变成1了,sum(value)的值是38。说明手动触发合并生效了。我们再来使用非聚合查询:
select * from tbl_test_summingmergetree;
此时,key=1的这条数据的确是合并完成了,由原来的3条变成1条了,而且value值的求和是正确的38。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。