Snowflake MigrationClickHouse Workshops
계획 워크시트

워크시트 1: MergeTree 엔진 선택

NYC Taxi 테이블마다 MergeTree 엔진을 선택한다. 모든 답에 즉시 피드백이 제공된다.

예상 소요 시간: 15–20분 참고 자료: MergeTree 엔진

개념

Snowflake에서는 테이블을 만들면 저장 방식은 Snowflake가 결정한다. ClickHouse에서는 스토리지 엔진을 직접 선택하며, 이 선택은 성능만이 아니라 정확성을 결정한다.

이 랩에 필요한 세 가지 엔진은 다음과 같다.

MergeTree — 기본 엔진. 데이터는 정렬된 컬럼 지향 파일로 저장된다. 중복 제거는 없다. 테이블이 삽입 전용일 때, 또는 파이프라인이 업데이트를 외부에서 관리할 때(예: dbt 실행마다 전체 재적재) 사용한다.

ReplacingMergeTree(version_col) — MergeTree에 백그라운드 중복 제거를 추가한 엔진. 동일한 ORDER BY 키를 가진 행이 여러 파트에 존재하면, 머지 후에는 version_col 값이 가장 큰 행만 남는다. 행이 업데이트될 수 있고 업데이트마다 단조 증가하는 컬럼(예: updated_at 타임스탬프)이 있을 때 사용한다.

결정적인 함정: 중복 제거는 비동기다. ClickHouse가 백그라운드 머지를 실행하기 전까지는 행의 이전 버전과 새 버전이 공존한다. ReplacingMergeTree 테이블에는 항상 SELECT ... FINAL을 사용해 쿼리 시점에 중복 제거를 강제하라.

AggregatingMergeTree — MergeTree에 부분 집계 상태 병합을 추가한 엔진. 테이블이 결합 가능한 집계 상태(예: HyperLogLog 스케치, 분위수 다이제스트)를 저장하고 백그라운드 집계가 필요할 때 사용한다. NYC Taxi 랩에는 필요하지 않다 — 집계 테이블은 누적되는 것이 아니라 dbt가 다시 만든다.

결정 트리

Does the table receive UPDATE or DELETE operations?
│
├── No (insert-only)
│   └─► MergeTree()
│
└── Yes
    ├── Is there a timestamp/version column that increases on every update?
    │   ├── Yes → ReplacingMergeTree(version_col)
    │   └── No (e.g., full-reload dimension tables)
    │       └─► MergeTree()  — dbt handles upsert via atomic table swap (full rebuild)
    │
    └── Does the table store partial aggregate states (AggregateFunction types)?
        └── Yes → AggregatingMergeTree()

스테이징 모델은 항상 뷰다

dbt + ClickHouse에서 스테이징 모델은 테이블이 아니라 뷰로 머티리얼라이즈해야 한다. 뷰는 스토리지 비용이 없고 항상 최신이다 — 물리적 객체가 아니라 저장된 SQL일 뿐이다.

아래 엔진 선택 연습은 분석 계층 dbt 모델(팩트 테이블, 집계, 디멘션)과 ClickHouse Materialized View를 대상으로 한다. trips_raw나 스테이징 모델은 포함하지 않는다.

  • **trips_raw**는 마이그레이션 스크립트(scripts/02_migrate_trips.py)가 직접 만드는 기본 ClickHouse 테이블이며 dbt 모델이 아니다. 마이그레이션 스크립트가 배치를 재시도해 같은 trip_id를 다시 삽입할 수 있기 때문에 ReplacingMergeTree(_synced_at)을 사용한다. 컷오버 이후에는 라이브 프로듀서도 일시적 실패 시 재시도할 수 있다. _synced_at DateTime DEFAULT now()가 가장 최근 쓰기가 이기도록 보장한다.
  • **stg_trips**는 trips_raw 위에 놓인 dbt 뷰다. SELECT ... FROM trips_raw FINAL을 적용해, 데이터가 하위 분석 모델에 도달하기 전에 머지되지 않은 중복을 해소한다. 중복 제거 책임은 ReplacingMergeTree 스테이징 테이블이 아니라 여기에 있다.

연습: NYC Taxi 테이블의 엔진 선택

아래 각 테이블에 대해 업데이트 패턴을 판단하고, (있다면) 버전 컬럼을 찾아내고, 테이블을 정확하게 유지하는 엔진을 선택하라. 모든 행을 채운 뒤 추론 문제를 풀어라.

Loading worksheet...

migration-plan.md로 옮기기

이 워크시트를 채웠으면 엔진 결정을 migration-plan.md의 Section 3에 복사하고 다음을 체크하라.

- [ ] Engine selection: completed

이 페이지의 내용

Track your progress?

Optional. We email a link to confirm your address; progress records once you open it.

Please use your work email address, not a personal one.

Progress tracking also requires accepting the current Terms of Service in Privacy settings.

KO