clickhouse中SummingMergeTree
SummingMergeTree适用于只要统计结果数据的汇总层数据,要求是统计的维度不变
我们在对汇总条件明确的情况下,统计数据,在ClickHouse中如何解决呢?最直接的方案就是使用MergeTree存储数据,然后通过GROUP BY聚合查询,并利用 SUM聚合函数汇总结果。这种方案存在两个问题。
存在额外的存储开销:终端用户不会查询任何明细数据,只关心汇总结果,所以不应该一直保存所有的明细数据。
存在额外的查询开销:终端用户只关心汇总结果,虽然MergeTree性能强大,但是每次查询都进行实时聚合计算也是一种性能消耗。
所以有了SummingMergeTree诞生
特点:
不指定合并字段ENGINE = SummingMergeTree() ,因为MergeTree是根据order by 尽情排序的,在分组内(默认就是order by字段)将数值类型的数据求和,如果有分区的情况下,在分区内是根据order by的字段当做分组(group by字段)进行分组,将数值类型的字段求和,对于非数值类型的取一条
指定合并字段ENGINE = SummingMergeTree(sal) 在分区内,根据order by 字段分组,对指定的字段sal值进行求和
其他符合类型的暂不介绍
小姐:SummingMergeTree使用ORDER BY排序键作为聚合数据的依据
只有在合并分区时才会触发汇总逻辑
聚合只会发生在同分区内,不同分区的数据不会发生聚合
如果SummingMergeTree((col1,col2,…))指定了字段,只会聚合指定字段,如果没有指定,会对所有非ORDER BY字段以外的数值字段进行聚合
汇总会对聚合的数值类型字段进行sum,对非聚合类型字段或者是非数值类型字段会取相同key分区的第一条
支持嵌套结构,但列字段名必须以Map为后缀结尾,任何名称以Key 、id、Type为后缀结尾的字段,都将和ORDER BEY指定的聚合字段组合成一个复合的key,进行聚合