머티리얼라이즈드 뷰와 프로젝션 비교
머티리얼라이즈드 뷰와 프로젝션 비교 (Materialized views versus projections)
사용자들이 자주 묻는 질문 중 하나는 머티리얼라이즈드 뷰(materialized view)를 써야 할지 프로젝션(projection)을 써야 할지예요. 이 문서에서는 두 기능의 핵심 차이점과 특정 시나리오에서 어느 쪽을 선택해야 하는지 살펴봅니다.
출처: 문서
본문
사용자들이 자주 묻는 질문 중 하나는 머티리얼라이즈드 뷰와 프로젝션을 언제 사용해야 하는지입니다. 이 문서에서는 두 기능의 핵심 차이점과 특정 시나리오에서 어느 쪽을 선택해야 하는지 그 이유를 살펴봅니다.
핵심 차이점 요약 (Summary of key differences)
아래 표는 고려할 여러 측면에서 머티리얼라이즈드 뷰와 프로젝션의 핵심 차이점을 요약합니다.
| 측면 | 머티리얼라이즈드 뷰 | 프로젝션 |
|---|---|---|
| 데이터 저장과 위치 | 결과를 별도의 명시적인 대상 테이블에 저장하며, 원본 테이블에 insert될 때 insert 트리거처럼 동작합니다. | 최적화된 데이터 레이아웃을 만들어 주 테이블 데이터와 함께 물리적으로 저장하며 사용자에게는 보이지 않습니다. |
| 업데이트 메커니즘 | 원본 테이블에 INSERT될 때 동기적으로 동작합니다(증분 머티리얼라이즈드 뷰 기준). 참고: refreshable materialized view를 사용해 스케줄링할 수도 있습니다. |
주 테이블에 INSERT될 때 백그라운드에서 비동기적으로 업데이트됩니다. |
| 쿼리 상호작용 | 머티리얼라이즈드 뷰를 사용하려면 대상 테이블을 직접 쿼리해야 합니다. 즉, 쿼리를 작성할 때 머티리얼라이즈드 뷰의 존재를 알고 있어야 합니다. | 프로젝션은 ClickHouse의 쿼리 최적화기가 자동으로 선택하며, 프로젝션이 있는 테이블의 쿼리를 수정하지 않아도 되어 사용자에게 투명합니다. 25.6 버전부터는 하나 이상의 프로젝션으로 필터링할 수도 있습니다. |
UPDATE / DELETE 처리 |
머티리얼라이즈드 뷰는 원본 테이블에 대한 정보가 없어 insert 트리거로만 동작하므로 원본 테이블의 UPDATE나 DELETE 작업에 자동으로 반응하지 않습니다. 이로 인해 원본과 대상 테이블 간 데이터가 오래될(staleness) 수 있으며, 우회 방법이나 주기적인 전체 새로고침(refreshable materialized view 사용)이 필요합니다. |
기본적으로 DELETED 행과 호환되지 않습니다(특히 lightweight deletes). lightweight_mutation_projection_mode(v24.7+)로 호환성을 활성화할 수 있습니다. |
JOIN 지원 |
예. Refreshable materialized view는 복잡한 역정규화(denormalization)에 사용할 수 있습니다. Incremental materialized view는 가장 왼쪽 테이블의 insert에만 트리거됩니다. | 아니요. 프로젝션 정의 안에서는 머티리얼라이즈드된 데이터를 필터링하기 위한 JOIN 연산이 지원되지 않습니다. 다만 프로젝션이 있는 테이블을 조인하는 쿼리는 정상적으로 동작합니다—프로젝션은 개별 테이블 접근을 최적화합니다. |
정의에서의 WHERE 절 |
예. 머티리얼라이즈드 이전에 데이터를 필터링하기 위해 WHERE 절을 포함할 수 있습니다. |
아니요. 프로젝션 정의 안에서는 머티리얼라이즈드된 데이터를 필터링하기 위한 WHERE 절이 지원되지 않습니다. |
| 체이닝(Chaining) | 예. 한 머티리얼라이즈드 뷰의 대상 테이블이 다른 머티리얼라이즈드 뷰의 원본이 될 수 있어 다단계 파이프라인을 구성할 수 있습니다. | 아니요. 프로젝션은 체이닝할 수 없습니다. |
| 적용 가능한 테이블 엔진 | 다양한 원본 테이블 엔진과 함께 사용할 수 있지만, 대상 테이블은 보통 MergeTree 계열입니다. |
MergeTree 계열 테이블 엔진에서 만 사용 가능합니다. |
| 실패 처리 | 데이터 삽입 중 실패하면 대상 테이블에서 데이터가 손실되어 잠재적 불일치가 발생할 수 있습니다. | 실패는 백그라운드에서 조용히 처리됩니다. 쿼리는 머티리얼라이즈드된 파츠와 안 된 파츠를 매끄럽게 섞어 사용할 수 있습니다. |
| 운영 오버헤드 | 명시적인 대상 테이블 생성과 종종 수동 backfill이 필요합니다. UPDATE/DELETE와의 일관성 관리는 복잡성을 높입니다. |
프로젝션은 자동으로 유지·동기화되며 일반적으로 운영 부담이 더 낮습니다. |
FINAL 쿼리 호환성 |
일반적으로 호환되지만, 대상 테이블에서 GROUP BY가 필요한 경우가 많습니다. |
FINAL 쿼리와 동작하지 않습니다. |
| 지연 머티리얼라이제이션 | 예. | materialization 기능을 사용할 때 프로젝션 호환성 문제를 모니터링하세요. query_plan_optimize_lazy_materialization = false를 설정해야 할 수 있습니다. |
| 병렬 복제본 (Parallel replicas) | 예. | 아니요. |
optimize_read_in_order |
예. | 예. |
| 경량 업데이트와 삭제 | 예. | 아니요. |
머티리얼라이즈드 뷰와 프로젝션 비교 (Comparing materialized views and projections)
언제 머티리얼라이즈드 뷰를 선택할까 (When to choose materialized views)
다음 같은 경우 머티리얼라이즈드 뷰 사용을 고려해야 합니다:
- 실시간 ETL 및 다단계 데이터 파이프라인을 다룰 때: 복잡한 변환, 집계를 수행하거나 데이터가 도착할 때 라우팅해야 하며, 뷰 체이닝으로 여러 단계를 거쳐야 할 수 있습니다.
- 복잡한 역정규화가 필요한 경우: 여러 원본(테이블, 서브쿼리, 딕셔너리)의 데이터를 단일 쿼리 최적화 테이블로 사전 조인(pre-join)해야 하며, 특히 refreshable materialized view를 이용한 주기적 전체 새로고침이 허용되는 경우.
- 명시적인 스키마 제어를 원할 때: 미리 계산된 결과를 위해 자체 스키마와 엔진을 가진 별도의 명확한 대상 테이블이 필요하며, 데이터 모델링에 더 큰 유연성을 제공합니다.
- 수집 시점에 필터링을 원할 때: 머티리얼라이즈드 이전에 데이터를 필터링해 대상 테이블에 기록되는 데이터 양을 줄여야 하는 경우.
언제 머티리얼라이즈드 뷰를 피할까 (When to avoid materialized views)
다음 같은 경우 머티리얼라이즈드 뷰 사용을 피하는 것을 고려해야 합니다:
- 원본 데이터가 자주 업데이트되거나 삭제되는 경우: 원본과 대상 테이블 간 일관성 처리를 위한 추가 전략이 없다면, 증분 머티리얼라이즈드 뷰가 오래되고 불일치해질 수 있습니다.
- 단순함과 자동 최적화를 선호하는 경우: 별도의 대상 테이블 관리를 피하고 싶다면.
언제 프로젝션을 선택할까 (When to choose projections)
다음 같은 경우 프로젝션 사용을 고려해야 합니다:
- 단일 테이블에 대한 쿼리 최적화: 기본 테이블에 대한 쿼리를 대체 정렬 순서 제공, primary key에 속하지 않는 컬럼 필터 최적화, 단일 테이블에 대한 집계 사전 계산으로 가속화하는 것이 주 목적입니다.
- 쿼리 투명성을 원할 때: 쿼리를 수정하지 않고 원래 테이블을 대상으로 하되, ClickHouse가 주어진 쿼리에 가장 좋은 데이터 레이아웃을 고르도록 하는 것입니다.
언제 프로젝션을 피할까 (When to avoid projections)
다음 같은 경우 프로젝션 사용을 피하는 것을 고려해야 합니다:
- 복잡한 데이터 변환이나 다단계 ETL이 필요한 경우: 프로젝션 정의는
JOIN연산을 지원하지 않으며, 다단계 파이프라인을 만들도록 체이닝할 수 없고, 윈도우 함수나 복잡한CASE문 같은 일부 SQL 기능을 처리할 수 없습니다. 프로젝션이 있는 테이블에 대한 쿼리는 자유롭게 조인할 수 있지만, 프로젝션 자체는 복잡한 데이터 변환에 적합하지 않습니다. - 머티리얼라이즈드된 데이터의 명시적 필터링이 필요한 경우: 프로젝션은 정의에서 프로젝션 자체로 머티리얼라이즈드되는 데이터를 필터링하기 위한
WHERE절을 지원하지 않습니다. - 비-MergeTree 테이블 엔진을 사용하는 경우: 프로젝션은
MergeTree계열 엔진을 사용하는 테이블에서만 사용 가능합니다. FINAL쿼리가 필수적인 경우: 프로젝션은 중복 제거에 때때로 사용되는FINAL쿼리와 동작하지 않습니다.- 병렬 복제본(parallel replicas)이 필요하다면, 프로젝션에서 지원되지 않으므로 피해야 합니다.
요약 (Summary)
머티리얼라이즈드 뷰와 프로젝션은 모두 쿼리 최적화와 데이터 변환을 위한 강력한 도구입니다. 일반적으로 둘을 택일(양자택일)로 보지 않는 것을 권장합니다. 대신 서로 보완적인 방식으로 사용해 쿼리를 최대한 활용할 수 있어요. 따라서 ClickHouse에서 머티리얼라이즈드 뷰와 프로젝션 사이의 선택은 실제로 특정 사용 사례와 접근 패턴에 달려 있습니다.
일반적인 경험칙으로, 하나 이상의 원본 테이블의 데이터를 대상 테이블로 집계해야 하거나 대규모에서 복잡한 변환을 수행해야 할 때 머티리얼라이즈드 뷰 사용을 고려하세요. 머티리얼라이즈드 뷰는 비싼 집계 작업을 쿼리 시간에서 insert 시간으로 옮기는 데 탁월합니다. 일일·월간 rollup, 실시간 대시보드, 데이터 요약에 아주 좋은 선택입니다.
반면에, 데이터의 물리적 정렬 순서를 결정하는 테이블 primary key와는 다른 컬럼으로 필터링하는 쿼리를 최적화해야 할 때는 프로젝션을 사용해야 합니다. 테이블의 primary key를 더 이상 변경할 수 없거나, 접근 패턴이 primary key가 수용할 수 있는 것보다 더 다양할 때 특히 유용합니다.