跳到主要内容
跳到主要内容

SummingMergeTree

该引擎继承自 MergeTree。其区别在于,当合并 SummingMergeTree 表的数据部分时,ClickHouse 会用一行替换所有具有相同主键(更准确地说,是具有相同 排序键)的行,该行包含具有数字数据类型的列的总和。如果排序键的构成方式使得单个键值对应于大量行,这将显著减少存储量并加快数据选择。

我们建议将该引擎与 MergeTree 一起使用。在 MergeTree 表中存储完整数据,并使用 SummingMergeTree 存储聚合数据,例如,在准备报告时。这种方法将防止由于主键构成不正确而丢失宝贵数据。

创建表

有关请求参数的描述,请参见 请求描述

SummingMergeTree 的参数

columns

columns - 一个元组,其中包含将被求和的列的名称。可选参数。 这些列必须为数字类型,并且不能在分区或排序键中。

如果未指定 columns,ClickHouse 将总结所有不在排序键中的数字类型的列的值。

查询子句

创建 SummingMergeTree 表时,所需的 子句 与创建 MergeTree 表时相同。

创建表的弃用方法
备注

在新项目中请勿使用此方法,并且如果可能,请将旧项目切换到上述描述的方法。

columns 外,所有参数的含义与 MergeTree 中相同。

  • columns — 一个元组,包含将被求和的列的名称。可选参数。有关描述,请参见上述文本。

使用示例

考虑以下表:

向其中插入数据:

ClickHouse 可能不会完全汇总所有行(见下文),因此我们在查询中使用聚合函数 sumGROUP BY 子句。

数据处理

当数据插入表中时,它们被原样保存。ClickHouse 定期合并插入的数据部分,此时具有相同主键的行被求和并被替换为每个结果数据部分的一行。

ClickHouse 可能合并数据部分,因此不同的结果数据部分可以包含具有相同主键的行,即汇总可能是不完整的。因此,在查询中应使用聚合函数 sum()GROUP BY 子句,如上面的示例所述。

汇总的通用规则

具有数字数据类型的列中的值会被求和。列的集合由参数 columns 定义。

如果所有列的汇总值为 0,则该行将被删除。

如果列不在主键中且不被求和,则从现有值中选择任意一个值。

对于主键中的列,不会进行求和。

聚合函数列中的求和

对于 AggregateFunction 类型 的列,ClickHouse 的行为与 AggregatingMergeTree 引擎一致,依据函数执行聚合。

嵌套结构

表可以具有以特殊方式处理的嵌套数据结构。

如果嵌套表的名称以 Map 结尾,并且它至少包含两个符合以下标准的列:

  • 第一列是数字 (*Int*, Date, DateTime) 或字符串 (String, FixedString),称为 key
  • 其他列为算术 (*Int*, Float32/64),称为 (values...)

那么该嵌套表被解释为 key => (values...) 的映射,当合并其行时,两个数据集的元素通过 key 合并,并对相应的 (values...) 进行求和。

示例:

请求数据时,使用 sumMap(key, value) 函数进行 Map 的聚合。

对于嵌套数据结构,您不需要在求和的列元组中指定其列。