← 학습 카테고리

Learn

ClickHouse

47개 모듈 · 현재 34번째

ClickHouse 모듈 34/47 clickhouse-learn-34

CollapsingMergeTree/VersionedCollapsingMergeTree — Sign 컬럼으로 행을 상쇄시킨다

ClickHouse CollapsingMergeTree/VersionedCollapsingMergeTree 및 system.query_log 공식 문서 종합 (웹 리서치, 2026) — ClickHouse 공식 문서(engines/table-engines/mergetree-family/collapsingmergetree, versionedcollapsingmergetree, operations/system-tables/query_log) ClickHouse 공식문서 CollapsingMergeTree, VersionedCollapsingMergeTree

이 모듈을 다 읽으면

  • Sign 컬럼(+1 state/-1 cancel)이 병합 시 짝을 이뤄 사라지는 원리를 설명할 수 있다
  • CollapsingMergeTree가 삽입 순서에 의존하는 이유와, VersionedCollapsingMergeTree가 Version 컬럼으로 이 제약을 어떻게 없애는지 설명할 수 있다

clickhouse-learn-04에서 다룬 ReplacingMergeTree(같은 키의 나중 값으로 덮어쓰기)와는 다른 방식으로, CollapsingMergeTree 계열이 Sign 컬럼을 이용해 '행 자체를 상쇄시켜 없애는' 갱신·삭제 패턴을 정리한다.

Sign 컬럼 — +1(state)과 -1(cancel)이 병합 시 짝을 이뤄 사라진다

CollapsingMergeTree는 특수한 Sign 컬럼을 쓴다 — Sign=1인 행은 '이게 현재 상태'라는 state 행이고, Sign=-1인 행은 같은 정렬 키(ORDER BY 기준)를 가진 이전 state를 취소한다는 cancel 행이다. 병합이 일어날 때, ORDER BY 기준 컬럼이 전부 같고 Sign만 다른 연속된 행 쌍은 백그라운드에서 비동기적으로 상쇄(collapse)돼 사라진다 — state 개수와 cancel 개수가 같고 마지막이 state면 첫 cancel과 마지막 state만 남기고, state가 더 많으면 마지막 state만, cancel이 더 많으면 첫 cancel만 남기는 식이다. clickhouse-learn-04의 ReplacingMergeTree가 '같은 키의 최신 값으로 덮어쓰기'였다면, 이건 '이전 값을 지우는 행 자체를 별도로 써서 짝으로 상쇄'시키는 접근이다.

핵심 포인트

  • Sign=1(state, 현재 상태)/Sign=-1(cancel, 같은 정렬키의 이전 state 취소) — 병합 시 이 둘이 짝을 이루면 비동기로 상쇄돼 사라짐
  • ReplacingMergeTree(최신 값으로 덮어쓰기)와 달리, 이전 값을 취소하는 cancel 행을 별도로 써서 짝을 상쇄시키는 방식

삽입 순서 의존 문제와 VersionedCollapsingMergeTree의 해법

CollapsingMergeTree의 상쇄 결과는 '객체 변경 이력의 일관성'에 강하게 의존한다 — state 행이 cancel 행보다 먼저 삽입돼야 한다는 순서를 지켜야 올바르게 상쇄되는데, 분산 환경에서 여러 프로듀서가 동시에 쓰면 이 순서가 어긋날 수 있다. VersionedCollapsingMergeTree는 여기에 Version 컬럼을 추가해 이 문제를 해결한다 — 병합 시 같은 정렬 키와 같은 Version을 가지면서 Sign만 다른 행 쌍을 지우는데, 이 규칙에는 행이 도착한 순서가 전혀 관여하지 않는다. 즉 CollapsingMergeTree와 달리 삽입 순서가 뒤섞여도(out-of-order) 올바르게 상쇄된다는 게 핵심 장점이다. 다만 두 엔진 모두, 병합이 아직 안 일어난 시점에 완전히 상쇄된 결과를 보려면 GROUP BY와 Sign을 반영하는 집계 함수로 직접 쿼리해야 한다.

핵심 포인트

  • CollapsingMergeTree는 삽입 순서(state가 cancel보다 먼저)에 의존 — 분산 환경 동시 쓰기 시 순서가 어긋나면 상쇄가 틀릴 수 있음
  • VersionedCollapsingMergeTree는 Version 컬럼을 추가해 '같은 정렬키+같은 Version, Sign만 다름'을 기준으로 상쇄 — 도착 순서와 무관하게 올바르게 동작(out-of-order 안전)
  • 병합 전 즉시 완전히 상쇄된 결과가 필요하면 두 엔진 모두 GROUP BY+Sign 반영 집계 함수로 직접 쿼리해야 함