ClickHouse 26.7: QBit 벡터 검색 정밀도 제어·조인 최적화·EXPLAIN ANALYZE로 OLAP 운영 기준을 갱신한 방법
요약
2026년 7월 23일 릴리스된 ClickHouse 26.7은 벡터 검색과 JOIN 최적화에 집중한 릴리스다. 이번 릴리스는 61개 신규 기능, 112개 성능 최적화, 329개 버그 수정을 포함한다.
주요 변화:
- QBit 벡터 검색 4종 개선: Int8 양자화·스트라이드 저장·Hadamard 회전·양자화 코덱으로 속도와 정밀도를 쿼리 시점에 제어
- JOIN 최적화 3종: 프로브 쪽 그래뉼 스킵·해시 테이블 압축·자동 조인 순서 결정으로 INNER JOIN 최대 313배 빠르게
- EXPLAIN ANALYZE: 실행 계획과 실제 실행 통계를 동시에 보여주는 새 명령
- 위치 인식 문구 검색: 텍스트 인덱스가 토큰 위치를 저장해 정확한 구문 검색 가능(실험적)
- GROUP BY … ORDER BY … LIMIT 가속: 추가 정렬 없이 상위 N개를 빠르게 반환
1. QBit 벡터 검색: 비트 단위로 정밀도를 제어하다
QBit 데이터 타입의 원리
ClickHouse는 25.10부터 벡터 근사 검색을 위한 실험적 데이터 타입 QBit를 도입했다. QBit는 벡터를 비트-슬라이스(bit-sliced) 형식으로 저장한다. Float32/BFloat16/Float64 벡터의 각 차원(dimension)을 비트 위치별로 슬라이스해 별도 컬럼에 보관하는 전치(transposed) 레이아웃이다.
이 구조의 핵심은 쿼리 시점 정밀도 선택이다. 검색할 때 비트 플레인 몇 개를 읽을지를 파라미터로 조정하면, 더 적은 I/O로 근사 결과를 얻거나 더 많은 비트를 읽어 정확도를 높일 수 있다.
-- QBit 컬럼을 가진 테이블 생성
CREATE TABLE embeddings (
id UInt64,
vec QBit(Float32, 1536) -- 1536차원 Float32 임베딩
) ENGINE = MergeTree()
ORDER BY id;
-- 정밀도 파라미터 p=16으로 근사 검색 (16비트 플레인까지 읽음)
SELECT id, L2DistanceTransposed(vec, [0.1, 0.2, ...], 16) AS dist
FROM embeddings
ORDER BY dist ASC
LIMIT 10;L2DistanceTransposed(vec, query, p)의 세 번째 인자 p가 읽을 비트 플레인 수를 제한한다. p를 낮추면 I/O가 줄고 속도가 빨라지며, p를 높이면 정밀도가 오른다.
26.7의 QBit 4종 개선
Float32 임베딩 → Int8로 양자화해 QBit에 바로 저장
FP32 대비 메모리 4배 절감, 26.7 신규
Float32(16비트) 중 10 비트 플레인만 저장
읽기 데이터 37.5% 감소, I/O 절감
양자화 전 랜덤 직교 변환 적용
각 차원에 오차를 균등 분산 → 재현율(recall) 향상
빠른 2단계 검색: 저정밀 스캔 후 후보군 정밀 재순위화
CODEC_AUTO로 자동 선택 가능
p 비트 플레인만 읽음 · 정밀도와 속도를 쿼리마다 조절 가능
① Int8 양자화 직접 저장: 26.7 이전에는 Float32 원본을 QBit로 변환하는 경로만 있었다. 이제 Int8로 양자화한 임베딩을 QBit에 직접 저장할 수 있어, 저장 공간을 추가로 줄이고 연산 비용도 낮출 수 있다.
② 스트라이드 저장: Float32 벡터는 32비트이므로 32개의 비트 플레인이 생긴다. 스트라이드 저장은 상위 10개 플레인만 보관하도록 설정해 읽기 데이터를 37.5% 줄인다. 하위 비트는 근사 검색에 큰 영향이 없어 생략해도 재현율 손실이 작다.
③ Randomized Hadamard 회전: 양자화는 각 차원의 값이 특정 범위에 집중될 때 오차가 커진다. Hadamard 변환은 입력 벡터를 직교 행렬로 회전시켜 에너지를 모든 차원에 균등 분산한다. 회전 행렬을 랜덤화해 고정 패턴에 과적합되는 문제도 방지한다.
④ 양자화 코덱: 2단계 검색 파이프라인을 자동으로 구성한다. 1단계에서 저정밀(빠른) QBit 스캔으로 후보군을 좁히고, 2단계에서 전체 정밀도로 후보를 재순위화한다. CODEC_AUTO 설정 시 ClickHouse가 워크로드에 맞는 코덱을 자동 선택한다.
2. JOIN 최적화 3종
이번 릴리스의 조인 개선은 독립적인 세 가지 변화가 겹쳐 상황에 따라 수백 배의 성능 차이를 만들어낸다.
① 프로브 쪽 그래뉼 스킵
해시 조인에서 기존에는 각 행을 해시 테이블에 조회해 일치 여부를 확인했다. 26.7은 런타임 필터가 수집한 조인 키 분포를 이용해 프로브 쪽(대형 테이블)에서 그래뉼(granule) 단위 스킵을 수행한다.
ClickHouse MergeTree의 그래뉼(기본 8192행)은 기본 키(primary key)와 스킵 인덱스(skip index) 통계를 갖는다. 조인 키가 기본 키 접두사와 겹치면 일치 행이 없는 그래뉼 전체를 읽지 않고 건너뜀으로써 I/O 자체를 줄인다.
효과: 대형 팩트 테이블과 소형 딤 테이블의 선택적 조인에서 프로브 I/O 대폭 감소.
② 해시 테이블 압축
26.7 이전에는 ANY 조인과 ALL 조인의 내부 해시 테이블 구현이 달랐다. ALL 조인 엔트리는 ANY 조인보다 더 많은 메모리를 사용했다.
26.7부터는 모든 조인 타입에서 8바이트 인덱스 기반 참조값으로 통일해 엔트리를 압축한다.
| 조인 규모 | 속도 향상 | 피크 메모리 감소 |
|---|---|---|
| 1억~3억 행 (중간값) | +12% | -15% |
| INNER JOIN on UInt64 키 | +21% | -38% |
캐시 효율이 높아지는 효과도 있어, 메모리 집약적인 대규모 집계 조인에서 추가 이득이 생긴다.
③ 자동 조인 순서 결정 (Join Ordering)
다중 테이블 쿼리에서 조인 순서는 성능에 결정적이다. 작은 테이블을 먼저 조인해 중간 결과를 줄여야 하지만, 기존 ClickHouse는 쿼리에 작성된 순서대로 조인했다.
26.7은 테이블 통계(행 수, 선택도)를 이용해 최적 조인 순서를 자동 결정하는 알고리즘을 추가했다.
313배 빠른 쿼리: 선택도가 낮은 조인을 마지막에 배치했던 기존 순서를 자동으로 재배열했을 때의 극단적 사례. 처리 행 339배 감소, 피크 메모리 592배 감소.
이 개선은 SET join_use_nulls = 1 환경에서도 동작하며, 옵티마이저가 실행 계획을 바꾸므로 기존에 수동으로 쿼리를 튜닝했던 경우 EXPLAIN으로 새 계획을 확인하는 것이 좋다.
3. EXPLAIN ANALYZE: 실행 계획과 실측 통계를 한 번에
기존 EXPLAIN의 한계
기존 EXPLAIN 명령은 옵티마이저가 세운 예상 실행 계획을 보여준다. 행 수 추정, 인덱스 사용 여부, 파이프라인 단계를 확인할 수 있었지만 실제 실행 중 통계(처리한 행 수, 경과 시간, 블록 수)는 볼 수 없었다.
EXPLAIN ANALYZE는 쿼리를 실제로 실행하면서 각 연산자의 실측 지표를 수집해 계획과 함께 출력한다.
EXPLAIN ANALYZE
SELECT
toStartOfHour(event_time) AS hour,
count() AS cnt
FROM events
WHERE event_type = 'click'
GROUP BY hour
ORDER BY hour;출력에서 확인할 수 있는 정보:
| 항목 | 내용 |
|---|---|
rows_read | 해당 단계에서 실제 읽은 행 수 |
rows_output | 다음 단계로 넘긴 행 수 |
elapsed_us | 단계별 실행 시간(마이크로초) |
blocks_read | 읽은 MergeTree 블록(그래뉼) 수 |
활용 포인트:
- 예상 행 수와 실측 행 수가 크게 다른 단계 → 통계 갱신 필요
blocks_read가 예상보다 많은 단계 → 인덱스 또는 파티션 설계 재검토elapsed_us가 특정 단계에 집중 → 병목 위치 특정
4. 위치 인식 문구 검색 (실험적)
기존 전문 검색(full-text search) 인덱스는 토큰의 존재 여부만 기록했다. "distributed database"를 검색하면 두 단어가 서로 떨어져 있어도 매칭됐다.
26.7은 텍스트 인덱스에 토큰 위치 정보를 저장하는 실험적 옵션을 추가했다. 위치를 저장하면 인접한 단어(연속 위치)를 가진 문서만 반환하는 정확한 구문 검색이 가능하다.
-- 위치 저장 텍스트 인덱스 활성화 (실험적)
SET allow_experimental_text_index_phrase_search = 1;
CREATE TABLE articles (
id UInt64,
content String,
INDEX content_idx content TYPE text(tokenizer = 'default', positions = true)
GRANULARITY 1
) ENGINE = MergeTree() ORDER BY id;
-- 정확한 문구 검색
SELECT id FROM articles
WHERE hasToken(content, 'distributed') AND hasToken(content, 'database')
AND phraseSearch(content, 'distributed database');Open question: 프로덕션 적용 시점은 실험적 플래그가 제거되는 향후 릴리스에서 확인 필요.
5. GROUP BY … ORDER BY … LIMIT 가속
분석 쿼리에서 흔한 패턴인 "집계 후 상위 N개 반환"은 이전에는 집계 결과 전체를 정렬한 뒤 LIMIT을 적용했다. 이 단계에서 메모리와 CPU를 과도하게 소비하는 문제가 있었다.
26.7은 이 패턴을 인식해 집계 단계에서 힙(heap) 자료구조로 상위 N개를 추적하고, 완전 정렬 없이 결과를 반환하도록 최적화했다. 대규모 집계에서 메모리 피크와 정렬 비용이 동시에 줄어든다.
운영 체크리스트: 26.7 업그레이드 시 확인 사항
조인 순서 자동화로 기존 쿼리 결과가 동일한지 EXPLAIN으로 확인
EXPLAIN ANALYZE에서 예상/실측 행 수 차이가 크면 ANALYZE TABLE 실행
Float32/BFloat16 임베딩 1000차원 이상 + ANN 검색 패턴 → QBit 고려
QBit는 여전히 실험적 플래그 필요
blocks_read, elapsed_us 기준으로 새 병목 위치 확인
이전 튜닝 기준값이 낮아졌을 수 있음
조인 순서 자동화 주의점: 26.7의 자동 조인 순서 결정은 테이블 통계에 의존한다. 통계가 부정확하면 역효과가 날 수 있다. 복잡한 조인 쿼리는 업그레이드 후 EXPLAIN 결과를 반드시 비교하라.
QBit 실험 플래그: allow_experimental_vector_similarity_index = 1이 여전히 필요하다. 프로덕션 적용 전에 재현율(recall@K)을 측정하고 허용 가능한 정밀도 손실 범위 내인지 확인하라.
요점 정리
- ClickHouse 26.7은 벡터 검색과 JOIN을 주축으로 한 성능 집중 릴리스다. 61개 신규 기능 + 112개 최적화 + 329개 버그 수정.
- QBit에 Int8 저장, 스트라이드(37.5% 읽기 감소), Hadamard 회전, 양자화 코덱이 추가돼 벡터 검색의 정밀도-속도 트레이드오프를 쿼리마다 제어할 수 있게 됐다.
- JOIN 3종 개선(프로브 그래뉼 스킵 · 해시 테이블 압축 · 자동 조인 순서)이 중형 INNER JOIN에서 중간값 12% 빠르고, 극단적 선택도 조건에서 313배 빠른 결과를 낸다.
EXPLAIN ANALYZE는 실행 계획 예측과 실측 통계를 한 화면에 보여줘 느린 쿼리 진단 방식을 바꾼다.- 위치 인식 구문 검색은 실험적이지만 ClickHouse를 전문 검색 엔진에 더 가깝게 만드는 방향의 첫 걸음이다.
- 업그레이드 시 자동 조인 순서 변화로 인한 실행 계획 변경을 사전에
EXPLAIN으로 검증하라.
References
- ClickHouse 26.7 release blog: <https://clickhouse.com/blog/clickhouse-release-26-07>
- ClickHouse changelog 2026: <https://clickhouse.com/docs/whats-new/changelog>
- QBit data type documentation: <https://clickhouse.com/docs/sql-reference/data-types/qbit>
- QBit implementation PR #87922: <https://github.com/ClickHouse/ClickHouse/pull/87922>
- ClickHouse vector search blog: <https://clickhouse.com/blog/qbit-vector-search>
- ClickHouse JOIN performance analysis 2026: <https://dataanalyticsguide.substack.com/p/clickhouse-join-performance-2026>
- TipRanks: ClickHouse 26.7 emphasizes performance and AI-oriented analytics: <https://www.tipranks.com/news/private-companies/clickhouse-26-7-release-emphasizes-performance-and-ai-oriented-analytics>