客快物流大数据项目(九十四):ClickHouse的SummingMergeTree深入了解

举报
Lansonli 发表于 2022/12/28 17:25:05 2022/12/28
【摘要】 ​ClickHouse的SummingMergeTree深入了解ClickHouse通过SummingMergeTree来支持对主键列进行预聚合。在后台合并时,会将主键相同的多行进行sum求和,然后使用一行数据取而代之,从而大幅度降低存储空间占用,提升聚合计算性能。ClickHouse只在后台Compaction时才会进行数据的预先聚合,而compaction的执行时机无法预测,所以可能会存...

ClickHouse的SummingMergeTree深入了解

ClickHouse通过SummingMergeTree来支持对主键列进行预聚合。在后台合并时,会将主键相同的多行进行sum求和,然后使用一行数据取而代之,从而大幅度降低存储空间占用,提升聚合计算性能。

ClickHouse只在后台Compaction时才会进行数据的预先聚合,而compaction的执行时机无法预测,所以可能会存在一部分数据已经被预先聚合,但仍有一部分数据尚未被聚合的情况。

因此在执行聚合计算时,SQL中仍需要使用GROUP BY子句来保证sum的准确。

在预聚合时,ClickHouse会对主键列以外的其他所有列进行预聚合。但这些列必须是数值类型才会计算sum(当sum结果为0时会删除此行数据);如果是String等不可聚合的类型,则随机选择一个值。

通常建议将SummingMergeTree与MergeTree配合使用,使用MergeTree来存储明细数据,使用SummingMergeTree存储预聚合的数据来支撑加速查询。

一、创建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值

二、创建SummingMergeTree引擎的tbl_test_summingmergetree表

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);
  • 查询表数据(有2条key=1的重复数据)
select * from tbl_test_summingmergetree;
  • 第三次插入重复数据
insert into tbl_test_summingmergetree(key,value) values(1,16);
  • 查询表数据(有3条key=1的重复数据)
select * from tbl_test_summingmergetree;
  • 使用sum和count查询数据

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;
  • 再次使用sum和count查询数据
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。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。