이 엔진은 MergeTree를 상속합니다. 핵심적인 차이점은 데이터 파트가 병합되는 방식에 있습니다. CoalescingMergeTree 테이블에서는 ClickHouse가 동일한 기본 키(primary key), 더 정확히는 동일한 정렬 키를 가진 모든 행을 각 컬럼의 최신 NULL이 아닌 값을 담은 단일 행으로 대체합니다.
이를 통해 컬럼 수준의 업서트가 가능하므로 전체 행이 아니라 특정 컬럼만 업데이트할 수 있습니다.
CoalescingMergeTree는 키가 아닌 컬럼에서 널 허용(널 허용) 타입과 함께 사용하도록 설계되었습니다. 컬럼이 널 허용이 아니면 동작은 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 테이블을 생성할 때와 동일한 절이 필요합니다.
테이블 생성의 Deprecated 메서드
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에 참여합니다. 따라서 여러 필드를 단일 Tuple 컬럼에 저장하면서 머지 중 각 요소별로 coalescing되도록 할 수 있습니다. 즉, 각 널 허용 서브컬럼은 최신 NULL이 아닌 값을 서로 독립적으로 유지합니다.
평탄화된 서브컬럼에도 일반 컬럼과 동일한 규칙이 적용됩니다:
- 정렬 키 또는 파티션 키(partition key)에 속하는
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 │
└─────┴──────────────┴──────────────┴─────────────────────┘