Projection과 EXPLAIN — 여러 정렬 순서를 한 테이블에
ClickHouse 코덱/인코딩 및 Projection/EXPLAIN 공식 문서·기술 블로그 종합 (웹 리서치, 2026) — ClickHouse 공식 문서(data-modeling/projections) + Altinity/ChistaData 등 기술 블로그 종합 ClickHouse 공식 문서 data-modeling/projections 및 EXPLAIN 가이드
이 모듈을 다 읽으면
- Projection이 clickhouse-learn-03의 ORDER BY 단일 정렬 한계를 어떻게 보완하는지 설명할 수 있다
- Projection이 쿼리 시점에 자동으로 선택된다는 것을 판단할 수 있다
- EXPLAIN indexes=1과 EXPLAIN PIPELINE이 각각 무엇을 진단하는 데 쓰이는지 구분할 수 있다
clickhouse-learn-03에서 다룬 'ORDER BY는 하나뿐이라 그 키에 안 맞는 쿼리는 느릴 수 있다'는 한계를, 같은 테이블 안에 대체 정렬본을 자동 유지하는 Projection으로 어떻게 보완하는지, 그리고 EXPLAIN으로 이를 어떻게 검증하는지 정리한다.
Projection — 같은 테이블, 다른 정렬 순서의 숨은 사본
clickhouse-learn-03에서 ORDER BY (event_date, user_id)로 정의된 테이블은 user_id 단독 필터가 느릴 수 있다고 했다. Projection은 이 문제를, 같은 테이블 안에 자동으로 유지되는 '숨은 사본'을 만들어 해결한다 — 예를 들어 (user_id, event_date) 순서로 정렬된 Projection을 하나 더 추가해두면, user_id로 필터링하는 쿼리는 원본 대신 이 Projection을 읽어 빠르게 처리된다. Materialized View + 별도 대상 테이블 조합과 달리, Projection은 별도 테이블을 만들 필요 없이 같은 테이블 정의 안에서 관리되고 INSERT 시 자동으로 함께 갱신된다.
핵심 포인트
- Projection = 같은 테이블 안에 다른 정렬 순서(다른 프라이머리 인덱스)로 자동 유지되는 대체 물리 표현
- ORDER BY 하나로는 못 커버하는 다른 접근 패턴의 쿼리를, 별도 테이블 없이 같은 테이블 정의 안에서 가속한다
쿼리 재작성 없이 자동으로 선택된다
Projection을 쓸 때 애플리케이션 쪽 쿼리는 전혀 바뀌지 않는다 — 사용자는 그냥 원래 테이블에 평소처럼 쿼리를 날리고, ClickHouse 옵티마이저가 그 쿼리의 필터/정렬 조건을 보고 원본 테이블과 Projection 중 어느 쪽이 더 적은 그래뉼을 스캔하는지 판단해 알아서 유리한 쪽을 골라 읽는다. 이 자동 선택 덕분에 Projection은 (Materialized View와 달리) 애플리케이션이 '어느 테이블을 쓸지'를 신경 쓸 필요가 전혀 없는 순수한 쿼리 가속 장치로 동작한다.
핵심 포인트
- 쿼리 자체는 원본 테이블을 대상으로 그대로 작성 — Projection 사용 여부는 옵티마이저가 자동 판단
- 애플리케이션이 '어느 테이블을 쓸지' 신경 쓸 필요 없는 투명한 쿼리 가속 장치
EXPLAIN으로 실제 동작 검증하기
EXPLAIN indexes = 1을 쿼리 앞에 붙이면, 프라이머리 인덱스(또는 Projection)가 얼마나 많은 그래뉼을 걸러냈는지(Granules: selected/total 비율)를 보여준다 — 이 비율이 낮을수록(적게 선택될수록) 인덱스/Projection이 효과적으로 작동했다는 뜻이다. Projection을 새로 만들었는데 실제로 쿼리 속도가 안 개선됐다면, 이 EXPLAIN으로 그 Projection이 정말 선택되고 있는지, 그래뉼을 잘 걸러내고 있는지부터 확인하는 것이 진단의 첫걸음이다. 한편 EXPLAIN PIPELINE은 다른 관점 — 쿼리가 실제로 몇 개의 병렬 스트림(실행 파이프라인)으로 처리되는지를 보여줘, '왜 이 쿼리가 CPU 코어를 다 못 쓰고 있나' 같은 병렬성 문제를 진단할 때 쓴다.
핵심 포인트
- EXPLAIN indexes = 1: 인덱스/Projection이 그래뉼을 얼마나 걸러냈는지(selected/total 비율) 확인 — 인덱스 효과 진단
- EXPLAIN PIPELINE: 쿼리가 몇 개의 병렬 스트림으로 처리되는지 확인 — 병렬성 문제 진단