LLM WikiAccess-protected knowledge portal
← 스터디 홈
102편 · 약 13분

ClickHouse 26.7: QBit 스트라이드·위치 인식 구문 검색·JOIN 순서 최적화로 OLAP 엔진이 AI 분석에 더 가까워진 방법

요약

2026년 8월 6일 릴리스된 ClickHouse 26.7은 61개 신기능, 112개 성능 최적화, 329개 버그 수정을 포함한다. 이번 릴리스의 핵심은 세 방향이다. QBit 벡터 검색은 Int8 지원·스트라이드 파라미터·비트 플레인 제어·Hadamard 회전으로 정밀도-속도 트레이드오프를 쿼리 시점에 조정할 수 있게 됐다. 위치 인식 구문 검색은 텍스트 인덱스에 토큰 위치 정보를 추가해 정확한 구문 검색을 SQL 내에서 처리한다. JOIN 최적화는 새로운 조인 순서 알고리즘과 컴팩트 해시 테이블로 복잡한 멀티 테이블 쿼리 성능을 높인다. Web UI는 탭 기반 멀티쿼리 워크스페이스로 전환됐다.


QBit 벡터 검색 네 가지 개선

ClickHouse의 근사 벡터 검색은 QBit 데이터 타입을 중심으로 진화하고 있다. 26.7은 한 릴리스에 네 가지 개선을 한꺼번에 추가했다.

① Int8 양자화
Float32 임베딩
Int8 저장
스토리지 1/4 감소
② 스트라이드(Stride)
QBit(1536, 8, 64)
64차원씩 그룹화
필요한 그룹만 I/O
③ 비트 플레인 제어
전체 16 플레인
10 플레인 읽기
I/O 37.5% 절감
④ Hadamard 회전
양자화 전 회전 적용
오류 균등 분산
같은 비트수로 높은 recall
ClickHouse 26.7 QBit 벡터 검색 개선 — 네 가지 축

① Int8 양자화

-- Float32 임베딩을 Int8 QBit 컬럼으로 저장
CREATE TABLE vectors (
    id      UInt64,
    content String,
    emb     QBit(1536, 8)   -- 1536차원, 8비트(Int8)
) ENGINE = MergeTree()
ORDER BY id;

Float32에서 Int8로 양자화하면 저장 공간이 4분의 1로 줄어들고, ANN 검색 시 메모리 대역폭 소비도 감소한다. Int8 정밀도로도 대부분의 시맨틱 검색 워크로드에서 충분한 recall을 확보할 수 있다.

② 스트라이드(Stride) 파라미터

QBit 타입에 세 번째 파라미터(stride)가 추가됐다.

-- QBit(dimensions, bits, stride)
CREATE TABLE vectors (
    id  UInt64,
    emb QBit(1536, 8, 64)  -- 64차원씩 독립 그룹으로 분할
) ENGINE = MergeTree()
ORDER BY id;

스트라이드를 지정하면 1536차원 벡터가 24개 그룹(1536 ÷ 64)으로 나뉜다. ANN 검색의 첫 번째 필터 단계에서 일부 그룹만 읽어 I/O를 줄이고, 두 번째 재순위화 단계에서 전체 차원을 읽는 두 단계 검색 구성이 가능해진다.

③ 비트 플레인(Bit Plane) 제어

-- 쿼리 시점에 비트 플레인 수 제어 (예시 문법)
SELECT id, cosineDistance(emb, query_embedding)
FROM vectors
ORDER BY cosineDistance(emb, query_embedding)
LIMIT 10
-- 내부적으로 비트 플레인 수를 조정해 I/O 절감

8비트 Int8 표현에서 비트 플레인 수를 줄이면 읽는 데이터 양이 줄어든다. 16 플레인(Float16 환산) 중 10 플레인만 읽으면 I/O가 37.5% 절감된다. 실험 결과 10 플레인에서도 99~99.5%의 recall을 유지한다.

④ 무작위 Hadamard 회전

양자화 전 무작위 Hadamard 변환을 적용하면 벡터 좌표를 고르게 섞는다. 특정 차원에 양자화 오류가 집중되는 현상을 막아, 같은 비트 수로 더 균일하고 높은 품질의 양자화 결과를 얻는다.

양자화 코덱은 이를 활용한 두 단계 검색을 지원한다. 1단계에서 빠른 저정밀 검색으로 후보를 좁히고, 2단계에서 정확한 거리 계산으로 재순위화한다.


위치 인식 구문 검색 (실험적)

26.7 이전의 텍스트 인덱스는 단어 존재 여부만 인덱싱했다. "machine learning"을 검색하면 "machine"과 "learning"이 각각 존재하는 문서가 모두 반환됐다.

26.7은 텍스트 인덱스에 토큰 위치 정보를 추가로 저장한다. 이로써 두 단어가 실제로 인접해서 등장하는지 검증할 수 있다.

-- 실험적 기능 활성화 필요
SET allow_experimental_text_index_phrase_search = 1;

-- 위치 인식 구문 검색 예시
SELECT id, title
FROM articles
WHERE hasTokens(body, 'machine learning')
LIMIT 20;

Open question: 26.7 공식 릴리스 노트에서 정확한 함수 이름과 구문 검색 API를 확인해야 한다. 위치 정보 추가로 인한 인덱스 크기 증가폭은 텍스트 특성에 따라 다르다.

이 기능은 현재 실험적(experimental) 상태다. allow_experimental_text_index_phrase_search 설정을 명시적으로 켜야 동작하며, 프로덕션 배포 전 테스트 환경에서 성능 영향을 검증해야 한다.


JOIN 최적화: 세 가지 개선

ClickHouse 26.7 JOIN 최적화 세 가지 ① 조인 순서 알고리즘 비용 기반(CBO) 순서 결정 작은 테이블 먼저 조인 중간 결과 최소화 전체 쿼리 성능 향상 ② 컴팩트 해시 테이블 Hash JOIN 빌드 단계 더 작은 해시 테이블 구성 CPU L3 캐시 적중률 증가 탐색 속도 향상 ③ 조건 프루닝 WHERE 조건 분석 복잡 조건을 JOIN 전으로 푸시다운 조인 대상 행 수 감소 불필요한 해시 탐색 제거
JOIN 최적화 전후 비교 — ClickHouse 26.7

① 새로운 조인 순서 알고리즘

멀티 테이블 JOIN에서 어떤 테이블을 먼저 조인하느냐에 따라 중간 결과 크기가 크게 달라진다. 26.7은 비용 기반(Cost-Based) 조인 순서 결정 알고리즘을 추가해 더 작은 중간 결과를 생성하는 순서를 자동으로 선택한다.

예를 들어 events JOIN users JOIN sessions 쿼리에서, users 테이블이 가장 작다면 events JOIN users를 먼저 처리해 중간 결과를 줄인 뒤 sessions과 조인하는 순서를 자동 선택한다.

② 더 컴팩트한 해시 테이블

Hash JOIN의 빌드 단계에서 사용하는 해시 테이블을 더 컴팩트하게 구성해 CPU 캐시 효율을 높인다. 해시 테이블이 L3 캐시에 들어갈 확률이 높아지면 프로브 단계의 탐색 속도가 크게 빨라진다.

③ 복잡 조건 프루닝

WHERE 절의 복잡한 조건을 JOIN 이전 단계로 내려보내(push-down) 조인 전 처리할 행 수를 줄인다. 기존에는 조인 후 필터링을 적용해 불필요한 해시 탐색이 발생했다.


GROUP BY … ORDER BY … LIMIT 퓨즈드 파이프라인

-- 자주 쓰이는 패턴: 집계 후 정렬해 상위 N개만 반환
SELECT user_id, sum(revenue) AS total
FROM events
GROUP BY user_id
ORDER BY total DESC
LIMIT 100;

이 패턴은 먼저 전체 GROUP BY 결과를 생성한 뒤 ORDER BY를 적용하고 LIMIT으로 잘라냈다. 26.7은 이 세 단계를 퓨즈드(fused) 파이프라인으로 통합한다.

퓨즈드 파이프라인에서는 상위 N개에 들어갈 가능성이 없는 그룹을 집계 중간 단계에서 미리 제거한다. 전체 집계 결과를 메모리에 올리지 않고도 상위 N개를 반환할 수 있어 메모리 사용량과 정렬 비용이 줄어든다.


Web UI: /play 엔드포인트 대변신

26.7 이전의 /play 엔드포인트는 단순 쿼리 콘솔이었다. 26.7은 이를 완전한 SQL 워크스페이스로 전환했다.

기능내용
여러 쿼리를 탭으로 동시 작업
상태 지속탭 제목·파라미터·결과 스냅샷이 새로고침·뒤로가기·URL 공유 후에도 유지
URL 통합탭 상태가 브라우저 히스토리와 URL에 반영돼 동료와 쿼리 공유 가능
스키마 인식 자동완성테이블명·컬럼명 자동완성과 키보드 네비게이션 지원
컬럼 시각화결과 컬럼별 미니 차트; 중요 컬럼 고정(pinning)
데이터베이스 패널테이블·컬럼 탐색 UI 개선

이 변화로 외부 GUI 도구(DBeaver, DataGrip 등) 없이 브라우저에서 바로 ClickHouse를 개발·탐색하는 경험이 크게 개선됐다.


기타 주요 개선

EXPLAIN ANALYZE 강화

쿼리 실행 중 실제 소요 시간과 처리 행 수를 측정하는 EXPLAIN ANALYZE의 출력이 더 상세해졌다. 어느 단계에서 시간이 걸리는지 파악하기 쉬워져 쿼리 튜닝 사이클이 빨라진다.

JIT 컴파일 정규식 엔진

반복적으로 사용되는 정규식을 JIT 컴파일해 실행 속도를 높인다. 로그 파싱이나 이벤트 분류처럼 같은 정규식을 대량 데이터에 적용하는 워크로드에서 효과적이다.

Apple Silicon 지원 강화

macOS/Apple Silicon(M1/M2/M3/M4 시리즈) 환경에서 더 빠르고 완전한 동작을 보장하도록 개선됐다. 로컬 개발 환경으로 Mac을 쓰는 엔지니어에게 직접적인 이점이 생긴다.


운영자 관점 체크리스트

[ ] QBit 컬럼: Int8 양자화 적용 여부 검토 (스토리지 4배 절감 가능)
[ ] 위치 인식 구문 검색 테스트 환경에서 recall/성능 확인
    (allow_experimental_text_index_phrase_search = 1 필요)
[ ] 핵심 멀티-테이블 쿼리 EXPLAIN으로 새 조인 순서 확인
    → 통계 정보 오래됐으면 OPTIMIZE TABLE 또는 재수집 검토
[ ] GROUP BY ... ORDER BY ... LIMIT 패턴 쿼리: 실행계획 비교
[ ] QBit 기존 컬럼: 스트라이드/Int8 활용하려면 스키마 재생성 필요
[ ] /play Web UI: 팀 내 쿼리 공유 URL 워크플로우 정비

요점 정리

  • ClickHouse 26.7은 61개 신기능, 112개 성능 최적화, 329개 버그 수정을 담았다 (2026-08-06 릴리스).
  • QBit에 Int8 양자화·스트라이드·비트 플레인 제어·Hadamard 회전이 추가돼 정밀도-I/O 트레이드오프를 쿼리별로 조정할 수 있다.
  • 텍스트 인덱스에 토큰 위치 정보가 추가돼 구문 검색이 가능해졌다 (실험적 기능).
  • 조인 순서 알고리즘·컴팩트 해시 테이블·조건 프루닝으로 복잡 JOIN 성능이 개선됐다.
  • GROUP BY…ORDER BY…LIMIT 퓨즈드 파이프라인으로 집계-정렬 워크로드의 메모리와 속도가 개선됐다.
  • /play Web UI가 탭·자동완성·시각화를 갖춘 완전한 SQL 워크스페이스로 전환됐다.

References

  • ClickHouse 26.7 공식 릴리스 블로그: <https://clickhouse.com/blog/clickhouse-release-26-07>
  • QBit 벡터 검색 블로그: <https://clickhouse.com/blog/qbit-vector-search>
  • QBit 데이터 타입 레퍼런스: <https://clickhouse.com/docs/sql-reference/data-types/qbit>
  • ClickHouse ANN 인덱스 문서: <https://clickhouse.com/docs/engines/table-engines/mergetree-family/annindexes>
  • TipRanks 릴리스 요약: <https://www.tipranks.com/news/private-companies/clickhouse-26-7-release-emphasizes-performance-and-ai-oriented-analytics>
  • GitHub 릴리스 페이지: <https://github.com/ClickHouse/ClickHouse/releases>