21天学不会clickhouse——SummingMergeTree

187 阅读1分钟

对于不查询明细,只关心以维度进行汇总聚合结果的场景。如果只使用普通的MergeTree

的话,无论是存储空间的开销,还是查询时临时聚合的开销都比较大。ClickHouse 为了这种场景,提供了一种能够“预聚合”的引擎 SummingMergeTree 

建表语句示例:

create table t_order_smt(
 id UInt32,
 sku_id String,
 total_amount Decimal(16,2) ,
 create_time Datetime 
) engine =SummingMergeTree(total_amount)
 partition by toYYYYMMDD(create_time)
 primary key (id)
 order by (id,sku_id );

➢ 以 SummingMergeTree()中指定的列作为汇总数据列

➢ 可以填写多列必须数字列,如果不填,以所有非维度列(非order by)且为数字列的字段为汇总数据列

➢ 以 order by 的列为准,作为维度列

➢ 其他的列按插入顺序保留第一行

➢ 不在一个分区的数据不会被聚合

➢ 只有在同一批次插入(新版本)或分片合并时才会进行聚合

tips:设计聚合表的话,唯一键值、流水号可以去掉,所有字段全部是维度、度量或者时间戳。

如果要是获取汇总值,还是需要使用 sum 进行聚合,因为会有一些没来得及聚合的明细,这样效率会有一定的提高,但本身 ClickHouse 是列式存储的,效率提升有限,不会特别明显。