此引擎继承自 MergeTree。关键区别在于 parts 的合并方式:对于 CoalescingMergeTree 表,ClickHouse 会将具有相同主键的所有行 (更准确地说,具有相同排序键的所有行) 合并为一行,该行包含每一列最新的非 NULL 值。
这使得列级 upsert 成为可能,也就是说,你可以只更新特定列,而不必更新整行。
CoalescingMergeTree 适用于非键列中的 Nullable 类型。如果这些列不是 Nullable,则其行为与 ReplacingMergeTree 相同。
创建表
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = CoalescingMergeTree([columns])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]有关请求参数的描述,请参见请求描述。
CoalescingMergeTree 参数
列
columns - 可选。一个 Tuple,包含要合并其值的列名。给定的列不能位于分区或排序键中。如果未指定 columns,ClickHouse 会合并所有不在排序键中的列的值。
查询子句
创建 CoalescingMergeTree 表时,需要使用与创建 MergeTree 表相同的子句。
已弃用的建表方法
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE [=] CoalescingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [columns])除 columns 外,所有参数的含义都与 MergeTree 中相同。
columns— 由其值将被求和的列名组成的 Tuple。可选参数。有关说明,请参见上文。
使用示例
以下表为例:
CREATE TABLE test_table
(
key UInt64,
value_int Nullable(UInt32),
value_string Nullable(String),
value_date Nullable(Date)
)
ENGINE = CoalescingMergeTree()
ORDER BY key向其中插入数据:
INSERT INTO test_table VALUES(1, NULL, NULL, '2025-01-01'), (2, 10, 'test', NULL);
INSERT INTO test_table VALUES(1, 42, 'win', '2025-02-01');
INSERT INTO test_table(key, value_date) VALUES(2, '2025-02-01');结果如下所示:
SELECT * FROM test_table ORDER BY key;┌─key─┬─value_int─┬─value_string─┬─value_date─┐
│ 1 │ 42 │ win │ 2025-02-01 │
│ 1 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 2025-01-01 │
│ 2 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 2025-02-01 │
│ 2 │ 10 │ test │ ᴺᵁᴸᴸ │
└─────┴───────────┴──────────────┴────────────┘为获得正确的最终结果,建议使用以下查询:
SELECT * FROM test_table FINAL ORDER BY key;┌─key─┬─value_int─┬─value_string─┬─value_date─┐
│ 1 │ 42 │ win │ 2025-02-01 │
│ 2 │ 10 │ test │ 2025-02-01 │
└─────┴───────────┴──────────────┴────────────┘使用 FINAL 修饰符会强制 ClickHouse 在查询时应用合并逻辑,确保你能为每一列获取正确、合并后的"最新"值。这是在从 CoalescingMergeTree 表中查询时最安全、最准确的方法。
Tuple 元素聚合
启用 allow_tuple_element_aggregation 设置后,Tuple 列会被递归展平,使每个叶子元素都能独立参与合并。这让您可以在单个 Tuple 列中存储多个字段,并在 合并 期间按元素分别合并——每个 Nullable 子列都会独立保留最新的非 NULL 值。
展平后的子列适用与普通列相同的规则:
- 属于 排序键 或 partition key 中
Tuple的子列不会参与合并。 - 如果指定了
columns,则只会合并所列Tuple列的子列。
CREATE TABLE coalescing_tuples
(
key UInt64,
data Tuple(
value_a Nullable(UInt64),
value_b Nullable(String),
nested Tuple(
value_c Nullable(UInt64)
)
)
) ENGINE = CoalescingMergeTree()
ORDER BY key
SETTINGS allow_tuple_element_aggregation = 1;
INSERT INTO coalescing_tuples VALUES (1, (100, NULL, (NULL)));
INSERT INTO coalescing_tuples VALUES (1, (NULL, 'hello', (42)));
SELECT key, data.value_a, data.value_b, data.nested.value_c FROM coalescing_tuples FINAL;┌─key─┬─data.value_a─┬─data.value_b─┬─data.nested.value_c─┐
│ 1 │ 100 │ hello │ 42 │
└─────┴──────────────┴──────────────┴─────────────────────┘