Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

CoalescingMergeTree 테이블 엔진

이 엔진은 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 │
└─────┴──────────────┴──────────────┴─────────────────────┘
Navigation