Materialized View — INSERT 트리거로서의 동작
ClickHouse 공식 문서(clickhouse.com/docs) 및 기술 블로그 종합 — MergeTree부터 분산 아키텍처까지 (웹 리서치, 2026) — ClickHouse 공식 문서 + Altinity/Tinybird 등 기술 블로그 교차 확인
이 모듈을 다 읽으면
- ClickHouse의 Materialized View가 일반 RDB의 뷰와 근본적으로 다르다는 것을 설명할 수 있다
- Materialized View가 언제 실행되고, 과거 데이터에는 왜 소급 적용되지 않는지 판단할 수 있다
ClickHouse의 Materialized View가 '조회 시점에 계산되는 가상 테이블'이 아니라 'INSERT 시점에 실행되는 트리거'라는 근본적으로 다른 개념임을 정리한다.
일반 뷰와 다르다 — Materialized View는 INSERT 트리거다
일반 RDB의 뷰는 SELECT할 때마다 정의된 쿼리를 즉석에서 실행한다. ClickHouse의 Materialized View는 다르다 — 원본(source) 테이블에 새 데이터가 INSERT될 때마다, 그 새로 들어온 배치에 대해서만 정의된 변환/집계 쿼리를 실행해 결과를 별도의 대상(target) 테이블에 저장한다. 즉 조회 시점이 아니라 쓰기 시점에 실행되는 '트리거'에 가깝다. 이 덕분에 무거운 집계(예: 시간대별 합계)를 매 조회마다 다시 계산하는 대신 INSERT 시점에 조금씩 미리 계산해두고, 실제 조회는 이미 집계된 대상 테이블에서 빠르게 읽기만 하면 된다.
핵심 포인트
- 일반 뷰: SELECT할 때마다 쿼리를 즉석 실행 / ClickHouse Materialized View: INSERT될 때 변환·집계해 대상 테이블에 저장(쓰기 시점 트리거)
- 무거운 집계를 매 조회마다 반복하지 않고 INSERT 시점에 미리 계산해두는 것이 핵심 이점
과거 데이터에는 소급 적용되지 않는다
Materialized View를 나중에 새로 만들면, 그 시점 이후에 들어오는 새 INSERT에 대해서만 트리거가 작동한다 — 원본 테이블에 이미 있던 과거 데이터는 자동으로 소급 반영되지 않는다(트리거이기 때문에 당연한 동작이다). 과거 데이터까지 채우려면 별도로 INSERT INTO target_table SELECT ... FROM source_table 같은 수동 백필(backfill) 작업을 해줘야 한다. 이 특성을 모르고 Materialized View를 만들었는데 '기존 데이터가 왜 집계 결과에 없지'라고 헷갈리는 경우가 실무에서 흔하다.
핵심 포인트
- Materialized View는 생성 시점 이후의 새 INSERT에만 작동 — 과거 데이터는 자동 소급 반영되지 않는다
- 과거 데이터를 채우려면 INSERT INTO ... SELECT ...로 별도 수동 백필이 필요하다