前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >客快物流大数据项目(九十四):ClickHouse的SummingMergeTree深入了解

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

原创
作者头像
Lansonli
发布2022-12-28 17:02:37
1.1K0
发布2022-12-28 17:02:37
举报
文章被收录于专栏:Lansonli技术博客

ClickHouse的SummingMergeTree深入了解

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

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

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

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

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

一、创建SummingMergeTree引擎表的的语法

语法结构

代码语言:javascript
复制
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表

代码语言:javascript
复制
create table tbl_test_summingmergetree(
        key UInt64,
        value UInt64
) engine=SummingMergeTree() order by key;

  • 第一次插入数据
代码语言:javascript
复制
insert into tbl_test_summingmergetree(key,value) values(1,13);

  • 查询第一次插入的数据
代码语言:javascript
复制
select * from tbl_test_summingmergetree;
  • 第二次插入重复数据
代码语言:javascript
复制
insert into tbl_test_summingmergetree(key,value) values(1,13);
  • 查询表数据(有2条key=1的重复数据)
代码语言:javascript
复制
select * from tbl_test_summingmergetree;
  • 第三次插入重复数据
代码语言:javascript
复制
insert into tbl_test_summingmergetree(key,value) values(1,16);
  • 查询表数据(有3条key=1的重复数据)
代码语言:javascript
复制
select * from tbl_test_summingmergetree;
  • 使用sum和count查询数据

sum函数用于计算value的和,count函数用于查看插入次数,group by用于保证是否合并完成都是准确的计算sum

代码语言:javascript
复制
select key,sum(value),count(value) from tbl_test_summingmergetree group by key;
  • 手动触发重复数据的合并
代码语言:javascript
复制
optimize table tbl_test_summingmergetree final;
  • 再次使用sum和count查询数据
代码语言:javascript
复制
select key,sum(value),count(value) from tbl_test_summingmergetree group by key;

结果集中key=1的count值变成1了,sum(value)的值是38。说明手动触发合并生效了。我们再来使用非聚合查询:

代码语言:javascript
复制
select * from tbl_test_summingmergetree;

此时,key=1的这条数据的确是合并完成了,由原来的3条变成1条了,而且value值的求和是正确的38。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ​ClickHouse的SummingMergeTree深入了解
    • 一、创建SummingMergeTree引擎表的的语法
      • 二、创建SummingMergeTree引擎的tbl_test_summingmergetree表
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档