사용자가 자주 묻는 질문 중 하나는 materialized views와 프로젝션을 각각 언제 사용해야 하는지입니다. 이 문서에서는 두 기능의 주요 차이점과 특정 시나리오에서 어느 쪽을 선택하는 것이 적절한지 살펴보겠습니다.
주요 차이점 요약
materialized view와 프로젝션 비교
materialized view를 선택할 때
- 실시간 ETL 및 다단계 데이터 파이프라인을 다루는 경우: 데이터가 들어오는 즉시 복잡한 변환이나 집계를 수행하거나 데이터를 라우팅해야 하며, 경우에 따라 뷰를 연결해 여러 단계로 처리해야 합니다.
- 복잡한 비정규화가 필요한 경우: 여러 소스(테이블, 서브쿼리 또는 딕셔너리)의 데이터를 쿼리에 최적화된 단일 테이블로 미리 조인해야 하며, 특히 갱신 가능 구체화 뷰를 사용한 주기적인 전체 갱신을 허용할 수 있다면 적합합니다.
- 명시적인 스키마 제어가 필요한 경우: 사전 계산된 결과를 저장하기 위해 자체 스키마와 engine을 갖는 별도의 대상 테이블이 필요하며, 이를 통해 데이터 모델링의 유연성을 더 높일 수 있습니다.
- 수집 시점에 필터링하려는 경우: 데이터가 구체화되기 전 에 필터링해야 하며, 이렇게 하면 대상 테이블에 기록되는 데이터 양을 줄일 수 있습니다.
materialized view 사용을 피해야 하는 경우
- 원본 데이터가 자주 업데이트되거나 삭제되는 경우: 원본 테이블과 대상 테이블 간의 일관성을 유지하기 위한 추가 전략이 없으면 증분형 materialized view가 오래되어 일관성이 깨질 수 있습니다.
- 단순성과 자동 최적화를 우선하는 경우: 별도의 대상 테이블을 관리하지 않으려는 경우입니다.
프로젝션을 선택해야 하는 경우
- 단일 테이블에 대한 쿼리 최적화: 주된 목표가 대체 정렬 순서를 제공하거나, 프라이머리 키에 포함되지 않은 컬럼의 필터를 최적화하거나, 단일 기본 테이블의 집계를 미리 계산해 해당 테이블의 쿼리 성능을 높이는 것인 경우입니다.
- 쿼리 투명성이 필요합니다. 즉, 쿼리를 수정하지 않고 원본 테이블을 그대로 대상으로 하면서, 주어진 쿼리에 가장 적합한 데이터 레이아웃을 ClickHouse가 선택하도록 하려는 경우입니다.
프로젝션 사용을 피해야 하는 경우
- 복잡한 데이터 변환 또는 다단계 ETL이 필요한 경우: 프로젝션 정의에서는
JOIN작업을 지원하지 않으며, 여러 단계의 파이프라인으로 연결할 수도 없고, 윈도우 함수나 복잡한CASE구문 같은 일부 SQL 기능도 처리할 수 없습니다. 프로젝션이 있는 테이블에 대한 쿼리에서는 자유롭게 조인을 사용할 수 있지만, 프로젝션 자체는 복잡한 데이터 변환에 적합하지 않습니다. - 구체화된 데이터를 명시적으로 필터링해야 하는 경우: 프로젝션 정의에서는
WHERE절을 지원하지 않으므로, 프로젝션 자체에 구체화될 데이터를 필터링할 수 없습니다. - MergeTree가 아닌 테이블 엔진을 사용하는 경우: 프로젝션은
MergeTree계열 엔진을 사용하는 테이블에서만 사용할 수 있습니다. FINAL쿼리가 필수인 경우: 프로젝션은FINAL쿼리와 함께 사용할 수 없으며,FINAL쿼리는 경우에 따라 중복 제거에 사용됩니다.- 병렬 레플리카가 필요한 경우: 프로젝션에서는 이를 지원하지 않습니다.