← 학습 카테고리

Learn

ClickHouse

47개 모듈 · 현재 13번째

ClickHouse 모듈 13/47 clickhouse-learn-13

Data Skipping Index — 프라이머리 키 밖의 컬럼을 가속하기

ClickHouse Data Skipping Index 및 Kafka 테이블 엔진 공식 문서·기술 블로그 종합 (웹 리서치, 2026) — ClickHouse 공식 문서(best-practices/use-data-skipping-indices-where-appropriate, integrations/kafka/kafka-table-engine) + Altinity 블로그 ClickHouse 공식 문서 Use data skipping indices where appropriate

이 모듈을 다 읽으면

  • Data Skipping Index가 clickhouse-learn-03의 ORDER BY 프리픽스 한계를 어떻게 보완하는지 설명할 수 있다
  • minmax/set/bloom_filter 세 인덱스 타입을 필터 패턴에 맞게 선택할 수 있다
  • GRANULARITY가 인덱스 정밀도와 오버헤드 사이의 트레이드오프임을 판단할 수 있다

clickhouse-learn-03에서 다룬 '프라이머리 키 왼쪽 컬럼이 아니면 잘 못 걸러진다'는 한계를, Projection(모듈 10)과는 다른 방식 — 그래뉼 단위 메타데이터로 보완하는 Data Skipping Index(2차 인덱스)를 정리한다.

프라이머리 인덱스가 못 하는 것을 그래뉼 메타데이터로 보완

clickhouse-learn-03에서 확인했듯 프라이머리(희소) 인덱스는 ORDER BY의 왼쪽 컬럼 순서에 맞는 쿼리만 그래뉼을 잘 걸러낸다 — 정렬 순서에 없는 컬럼으로 필터링하면 모든 그래뉼을 다 훑어야 한다. Data Skipping Index(2차 인덱스)는 각 그래뉼에 대해 특정 컬럼(또는 표현식)의 요약 정보(최솟값/최댓값, 값 집합, 확률적 멤버십 정보 등)를 미리 계산해둬서, 쿼리 실행 시 '이 그래뉼은 조건을 만족할 수 없다'고 확신할 수 있으면 그 그래뉼 전체를 읽지 않고 건너뛴다. clickhouse-learn-10에서 다룬 Projection이 '아예 다른 정렬 순서의 사본'을 만드는 무거운 방법이라면, Skip Index는 원본 데이터 위에 가벼운 메타데이터만 얹는 방법이라는 차이가 있다.

핵심 포인트

  • 프라이머리 인덱스는 ORDER BY 왼쪽 컬럼에만 효과적 — Skip Index는 그 밖의 컬럼에 그래뉼 단위 메타데이터로 필터링을 보완한다
  • Projection(별도 정렬 사본, 무거움)과 달리 Skip Index는 원본 데이터 위에 가벼운 메타데이터만 추가하는 방식

세 가지 타입 — 필터 패턴에 맞게 골라야 한다

minmax는 그래뉼별 최솟값/최댓값만 저장하는 가장 단순한 타입으로, 범위 조건(BETWEEN, >, < 등)에 효과적이며 값이 느슨하게라도 정렬돼 있을수록 잘 먹힌다. set은 그래뉼별로 나타나는 고유 값의 집합을 저장한다 — 상태 코드나 불리언성 플래그처럼 저카디널리티 컬럼의 등치(=) 조건에 적합하다(값 종류가 적어야 집합 크기가 작게 유지된다). bloom_filter는 정확한 값 목록 대신 확률적 자료구조(블룸 필터)로 '이 값이 있을 수도 있다/절대 없다'만 판단한다 — 고카디널리티 컬럼의 등치 조건에 적합하지만, '없다'는 판단은 확실해도 '있다'는 판단은 확률적이라(false positive 가능) NOT LIKE나 != 같은 부정 조건 최적화에는 못 쓴다.

핵심 포인트

  • minmax: 그래뉼별 최솟값/최댓값 — 범위 조건(BETWEEN 등)에 적합, 느슨한 정렬만 있어도 효과적
  • set: 그래뉼별 고유값 집합 — 저카디널리티 컬럼의 등치(=) 조건에 적합
  • bloom_filter: 확률적 멤버십 판단(블룸 필터) — 고카디널리티 등치 조건에 적합하나, false positive 가능성 때문에 NOT LIKE/!= 같은 부정 조건에는 못 쓴다

GRANULARITY — 정밀도와 오버헤드의 트레이드오프

Skip Index 생성 시 GRANULARITY 파라미터는 인덱스 블록 하나가 몇 개의(테이블) 그래뉼을 묶어 요약할지를 정한다. 이 값을 작게 잡으면(더 잘게 나눠 요약) 그래뉼을 걸러내는 정밀도가 높아지지만, 그만큼 인덱스 메타데이터 자체가 커지고 INSERT 시 이를 계산하는 CPU·디스크 오버헤드도 커진다 — 무조건 잘게 나눈다고 좋은 게 아니라, 실제 쿼리 패턴과 컬럼의 값 분포를 보고 정밀도-오버헤드 트레이드오프를 판단해야 한다.

핵심 포인트

  • GRANULARITY가 작을수록 그래뉼 필터링 정밀도는 높아지지만 인덱스 메타데이터 크기와 INSERT 시 계산 오버헤드도 커진다
  • 값 분포와 실제 쿼리 패턴을 보고 정밀도-오버헤드 트레이드오프를 판단해야 한다