← 학습 카테고리

Learn

ClickHouse

47개 모듈 · 현재 17번째

ClickHouse 모듈 17/47 clickhouse-learn-17

SAMPLE 절 — 정확도를 조금 포기하고 응답 속도를 얻는 결정론적 샘플링

ClickHouse SAMPLE 절 및 Array/Map/Nested 데이터 타입 공식 문서 종합 (웹 리서치, 2026) — ClickHouse 공식 문서(sql-reference/statements/select/sample, sql-reference/data-types/nested-data-structures/nested) ClickHouse 공식 문서 SAMPLE clause

이 모듈을 다 읽으면

  • SAMPLE이 진짜 무작위가 아니라 샘플링 키 해시 기반의 결정론적 방식이라는 것을 설명할 수 있다
  • SAMPLE k를 쓸 때 집계 결과를 스케일링해야 하는 이유와 방법을 설명할 수 있다

clickhouse-learn-03에서 다룬 ORDER BY 기반 프라이머리 인덱스 설계를 전제로, 테이블 생성 시 지정해둔 샘플링 키를 이용해 전체 데이터의 일부만 읽어 근사치를 빠르게 얻는 SAMPLE 절을 정리한다.

전제조건 — 테이블에 샘플링 키가 미리 지정돼 있어야 한다

SAMPLE 절은 아무 테이블에서나 쓸 수 있는 게 아니라, MergeTree 계열 테이블을 만들 때 SAMPLE BY로 샘플링 키를 미리 지정해둔 경우에만 동작한다. 이 샘플링 키는 보통 ORDER BY 표현식의 접두사(prefix)로 지정되며, 이 키의 해시값을 기준으로 데이터가 정렬돼 있어야 SAMPLE이 '해시값 범위'만 골라 읽는 방식으로 효율적으로 동작할 수 있다.

핵심 포인트

  • SAMPLE은 테이블 생성 시 SAMPLE BY로 샘플링 키를 미리 지정해둔 MergeTree 계열 테이블에서만 동작
  • 샘플링 키는 보통 ORDER BY 표현식의 접두사로 지정 — 이 키의 해시값 기준 정렬이 SAMPLE의 효율적 동작 전제

무작위가 아니라 결정론적 — 같은 쿼리는 항상 같은 부분집합을 고른다

SAMPLE은 매번 다른 무작위 행을 고르는 게 아니라, 샘플링 키의 해시값을 기준으로 한 결정론적 방식으로 동작한다 — 그래서 똑같은 SAMPLE 쿼리를 여러 번 실행해도 항상 같은 결과가 나온다. 이 재현성 덕분에 서브쿼리나 JOIN 안에서도 안전하게 쓸 수 있다(무작위 샘플링이었다면 서브쿼리마다 다른 부분집합이 뽑혀 조인 결과가 뒤틀릴 수 있었을 것). 문법은 세 가지다 — SAMPLE k(0~1 사이 비율, 예: 0.1은 10%), SAMPLE n(최소 n행 보장), SAMPLE k OFFSET m(m 지점부터 시작하는 비율 샘플).

핵심 포인트

  • SAMPLE은 샘플링 키 해시 기반의 결정론적 방식 — 같은 쿼리는 항상 같은 부분집합을 반환해 서브쿼리/JOIN에서도 안전
  • SAMPLE k(비율)/SAMPLE n(최소 행수 보장)/SAMPLE k OFFSET m(오프셋 지정 비율) 세 가지 문법

집계 결과는 그대로 쓸 수 없다 — 스케일링이 필요

SAMPLE k로 전체의 일부만 읽었다면, COUNT나 SUM 같은 집계 결과는 실제 전체 값이 아니라 샘플링된 부분의 값이므로 수동으로 스케일링해야 한다(예: SAMPLE 0.1로 얻은 COUNT에 10을 곱해야 전체 추정치가 나온다). SAMPLE n을 쓴 경우는 실제 샘플링 비율이 매번 달라질 수 있어 수동 계수 대신 _sample_factor라는 가상 컬럼을 곱해 동적으로 스케일링해야 한다. 반면 AVG 같은 평균 계열 집계는 샘플이 전체를 대표한다는 가정하에 별도 스케일링이 필요 없다.

핵심 포인트

  • SAMPLE k 사용 시 COUNT/SUM은 샘플링 비율의 역수를 곱해 수동 스케일링 필요
  • SAMPLE n은 실제 비율이 변동적이라 _sample_factor 가상 컬럼으로 동적 스케일링, AVG류는 스케일링 불필요