このエンジンは MergeTree を継承しています。主な違いは、パーツのマージ方法にあります。CoalescingMergeTree テーブルでは、ClickHouse は同じ主キー (より正確には同じソートキー) を持つすべての行を、各カラムの最新の非 NULL 値を含む 1 行に置き換えます。
これにより、カラム単位の 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 - 任意。値を結合するカラム名のタプルです。指定するカラムは、パーティションまたはソートキーに含めることはできません。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— 値が合計されるカラム名のタプル。省略可能なパラメーターです。説明については、上記の本文を参照してください。
使用例
次のテーブルについて考えます。
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 カラムは再帰的にフラット化され、各リーフ要素が独立して coalescing の対象になります。これにより、複数のフィールドを 1 つの Tuple カラムに格納しつつ、マージ時には要素単位で coalescing できます。各 Nullable サブカラムは、それぞれ独立して最新の非 NULL 値を保持します。
フラット化されたサブカラムにも、通常のカラムと同じルールが適用されます。
- ソートキーまたはパーティションキー内の
Tupleに属するサブカラムは、coalescing の対象外です。 columnsが指定されている場合、列挙されたTupleカラムのサブカラムのみが coalescing されます。
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 │
└─────┴──────────────┴──────────────┴─────────────────────┘