SummingMergeTree
该引擎继承自 MergeTree。不同之处在于,在合并 SummingMergeTree
表的数据部分时,ClickHouse 会将具有相同主键(或者更准确地说,是具有相同 排序键)的所有行替换为一行,这一行包含具有数值数据类型的列的汇总值。如果排序键的组成方式使得单个键值对应多个行,这将显著减少存储容量并加快数据选择速度。
我们建议将该引擎与 MergeTree
一起使用。将完整数据存储在 MergeTree
表中,并使用 SummingMergeTree
存储聚合数据,例如,在准备报告时。这样的做法将防止由于主键构成不正确而导致重要数据的丢失。
创建表
有关请求参数的描述,请参阅 请求描述。
SummingMergeTree的参数
columns
columns
- 一个包含将在其中汇总值的列名的元组。可选参数。
列必须为数值类型,并且不能在主键中。
如果未指定 columns
,ClickHouse 将在所有不在主键中的数值数据类型的列中汇总值。
查询子句
创建 SummingMergeTree
表时,需要使用与创建 MergeTree
表时相同的 子句。
已弃用的创建表方法
在新项目中请勿使用此方法,尽可能地将旧项目切换到上述描述的方法。
除了 columns
以外,所有参数的意思与 MergeTree
中相同。
columns
— 包含将汇总值的列名的元组。可选参数。有关描述,请参见上述文本。
使用示例
考虑以下表:
插入数据:
ClickHouse可能并不会完全汇总所有行(见下文),因此我们在查询中使用聚合函数 sum
和 GROUP BY
子句。
数据处理
当数据插入到表中时,它们会按原样保存。ClickHouse 定期合并插入的数据部分,这时具有相同主键的行会被汇总并替换为每个结果数据部分中的一行。
ClickHouse 可以合并数据部分,以便不同的结果数据部分可以包含具有相同主键的行,即汇总将是不完整的。因此(SELECT
)查询中应使用聚合函数 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
进行聚合。
对于嵌套数据结构,您无需在汇总的列元组中指定其列。