워크시트 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