← 학습 카테고리

Learn

ClickHouse

47개 모듈 · 현재 39번째

ClickHouse 모듈 39/47 clickhouse-learn-39

WITH 절(CTE) — 기본은 매번 다시 실행되는 인라인 치환이다

ClickHouse JSON 타입 및 WITH 절(CTE)/Materialized CTE 공식 문서 종합 (웹 리서치, 2026) — ClickHouse 공식 문서(sql-reference/data-types/object-data-type, sql-reference/statements/select/with) + 공식 블로그 ClickHouse 공식문서 WITH Clause

이 모듈을 다 읽으면

  • 기본 CTE가 저장된 결과가 아니라 매 참조 지점마다 재실행되는 인라인 치환이라는 것을 설명할 수 있다
  • MATERIALIZED 키워드가 이 기본 동작을 어떻게, 왜 바꾸는지 설명할 수 있다

clickhouse-learn-25에서 이름만 스쳐 지나갔던 CTE(Common Table Expression)를 전제로, WITH 절의 기본 동작이 '한 번 계산해서 재사용'이 아니라 '참조할 때마다 다시 계산'이라는 의외의 사실과, 이를 바꾸는 MATERIALIZED 옵션을 정리한다.

기본 동작 — 결과 재사용이 아니라 서브쿼리 인라인 치환

CTE는 WITH 절로 정의하는 이름 붙은 임시 결과 집합으로, 복잡한 쿼리를 이름 붙인 재사용 가능한 단위로 쪼개 가독성을 높이고 깊게 중첩된 서브쿼리를 없애준다. 그런데 다른 여러 DB와 달리, ClickHouse의 기본 동작은 결과를 저장해뒀다가 재사용하는 게 아니다 — SELECT 쿼리 안에서 그 CTE를 참조하는 지점마다, 정의부의 서브쿼리를 그 자리에 그대로 인라인으로 치환해 매번 다시 실행한다. 즉 같은 CTE를 self-join이나 여러 IN 서브쿼리에서 3번 참조하면, 그 서브쿼리는 3번 다시 계산된다.

핵심 포인트

  • CTE: WITH 절로 정의하는 이름 붙은 임시 결과 — 복잡한 쿼리를 재사용 가능한 단위로 쪼개 가독성 향상, 중첩 서브쿼리 제거
  • 기본 동작은 '결과 저장 후 재사용'이 아니라 '참조 지점마다 서브쿼리를 인라인 치환해 매번 재실행' — 같은 CTE를 3번 참조하면 3번 다시 계산됨

MATERIALIZED — 한 번만 계산하고 결과를 재사용한다

WITH <이름> AS MATERIALIZED (<서브쿼리>) 문법으로 CTE를 MATERIALIZED로 지정하면, 이 기본 동작이 바뀐다 — ClickHouse가 그 CTE의 서브쿼리를 정확히 한 번만 실행해 결과를 임시 테이블에 저장해두고, 이후의 모든 참조는 그 저장된 결과에서 가져온다. 같은 CTE가 self-join이나 여러 IN 서브쿼리에서 여러 번 쓰이는 경우 특히 유용하다 — 밑바탕 연산이 딱 한 번만 일어나기 때문이다. 이 기능은 analyzer와 enable_materialized_cte 설정이 필요한 실험적 기능(26.3에서 도입)이라는 점도 함께 알아둬야 한다.

핵심 포인트

  • WITH <이름> AS MATERIALIZED (<서브쿼리>)로 지정하면 서브쿼리를 정확히 한 번만 실행해 임시 테이블에 저장, 이후 참조는 전부 그 저장된 결과에서 가져옴
  • 같은 CTE가 self-join·여러 IN 서브쿼리에서 반복 사용될 때 특히 유용 — analyzer+enable_materialized_cte 설정이 필요한 실험적 기능(26.3 도입)