SummingMergeTree引擎功能介绍
- 根据排序见对数值类型的列进行汇总求和
- 相同排序见的行合并为一行。
- 如果一个排序键对应大量的行,则该引擎能显著减少存储空间并加快数据查询速度。
- 建议该引擎于MergeTree引擎结合使用。完整的数据存储在MergeTree表中,使用SummingMergeTree存储聚合数据,可以防止排序键的组合不正确而丢失有价值的数据。
指定表引擎
ENGINE = SummingMergeTree([columns])
- 参数: columns,具有列名称的元组,其中的值将被汇总。可选参数。
- 列必须是数值类型,并且不能是主键中列。
- 如果columns参数没有指定,Clickhouse将汇总除了主键列之外的所有数值类型列的值。
汇总规则
- 数值类型的列值会被汇总,列的集合由参数columns定义。
- 如果求和的所有列中的值都为0,则删除该行。
- 如果列不在主键中且未汇总,则从现有的值中任意选择一个值。
- 主键中的列不会汇总。
- Clickhouse可能不会完整地汇总所有行,因此需在查询中使用聚合函数sum和GROUP BY子句。
案例演示
# 创建表
drop table summtt;
CREATE TABLE summtt
(
key String,
name String,
value Int32
)
ENGINE = SummingMergeTree()
ORDER BY key;
# 插入数据
insert into summtt values('a', 'xiaoa1', 1);
insert into summtt values('a', 'xiaoa2', 2);
insert into summtt values('b', 'xiaob1', 10);
insert into summtt values('b', 'xiaob2', 20);
insert into summtt values('c', 'xiaob1', 10);
insert into summtt values('c', 'xiaob2', -10);
# 查询数据发现聚合
SELECT * FROM summtt;
# 执行合并命令,为0的会被删除
optimize table summtt;
select * from summtt;
select key, sum(value) from summtt group by key;