워크시트 5: dbt 모델 설계
각 dbt 모델의 머티리얼라이제이션, 엔진, 증분 전략을 설정한다. 모든 답에 즉시 피드백이 제공된다.
예상 소요 시간: 15–20분 참고 자료: dbt on ClickHouse
개념
워크시트 1–4는 무엇을 만들어 냈다. 어떤 엔진, 어떤 ORDER BY, 어떤 ClickHouse 타입인지다. 이 워크시트는 어떻게를 만들어 낸다. SQL을 한 줄도 쓰기 전에 그 결정들을 dbt 설정으로 어떻게 표현하는지다.
dbt-clickhouse 모델에는 Snowflake 개발자가 신경 쓸 필요가 없던 세 계층의 설정이 있다.
- 머티리얼라이제이션 — dbt가 어떤 물리적 객체를 만드는가(view, table, incremental, ephemeral)?
- 엔진 설정 — 테이블과 증분 모델의 경우 어떤 ClickHouse 엔진과 버전 컬럼인가?
- 증분 전략 — 증분 모델의 경우 dbt가 신규/갱신된 행을 어떻게 처리하는가?
ReplacingMergeTree에만 있는 정확성 문제도 하나 있다.
- FINAL 배치 — 중복이 제거된 읽기를 보장하기 위해 dbt DAG의 어디에
FINAL을 두는가?
머티리얼라이제이션에는 다음 결정 트리를 사용하라.
- 소스에서 삽입 전용으로 읽고, 모델 자체에는 쓰기가 없다? →
view - 순수 조인 로직이고, 직접 쿼리되지 않는다? →
ephemeral - dbt 실행마다 전체 재구축하고, 부분 업데이트는 없다? →
table - 실행마다 신규/변경된 행만 처리한다? →
incremental
스테이징 모델은 항상 뷰다 — 워크시트 1과 같은 규칙이다. stg_trips와
stg_taxi_zones는 자체 쓰기가 없는 통과 읽기이므로, 소스 데이터가 어떻게 동작하든 뷰로
남는다.
연습 1: 머티리얼라이제이션 선택
각 모델에 대해 올바른 dbt 머티리얼라이제이션을 선택한 다음, 표 아래 문제에서 그 이유에 답하라.
연습 2: 엔진 설정
table 또는 incremental 머티리얼라이제이션을 쓰는 모델만 ClickHouse 엔진이 필요하다 —
뷰와 ephemeral 모델에는 없다. 워크시트 1의 답을 참조하라. dbt 엔진 설정은 그곳에서 이미 내린
엔진 결정을 구현한 것이다.
연습 3: 증분 전략 설계
각 증분 모델에 대해 전체 증분 설정을 설계하라: unique_key,
incremental_strategy, 그리고 is_incremental() 가드 블록 안에 들어가는 SQL 필터다.
{% if is_incremental() %}
WHERE <your filter here>
{% endif %}연습 4: FINAL 배치
ReplacingMergeTree의 중복 제거는 비동기다. FINAL은 읽기 시점에 그것을 강제한다 — 하지만
FINAL을 잘못된 모델에 두면 정확성이나 성능 측면에서 대가가 따른다. 아래 각 모델에 대해
FINAL이 그 모델 자신의 FROM 절에 들어가야 하는지 답하라.
Loading worksheet...
migration-plan.md로 옮기기
이 워크시트를 완료했으면 migration-plan.md의 Section 10을 자신의 답으로 채우고 다음을
체크하라.
- [ ] dbt model design: completed