ClickHouse 26.8 LTS: Parquet/S3 11배 절감·Adaptive GROUP BY·백그라운드 쿼리로 달라진 운영 경계
요약
ClickHouse 26.8은 2026년 8월 30일 출시된 Long-Term Support(LTS) 릴리스다. 직전 LTS인 26.3에서 바로 넘어오는 팀은 중간 버전 26.4, 26.5, 26.6, 26.7의 변경 사항까지 한꺼번에 적용하게 되므로 실제로는 57개의 Breaking Change를 처리해야 한다. 이 글은 운영자 관점에서 가장 중요한 기능 세 가지—Parquet/S3 열 지연 로딩, Adaptive 병렬 GROUP BY, 백그라운드 쿼리 실행—를 중심으로 업그레이드 전에 알아야 할 점을 정리한다. 앞서 26.7에서 도입된 EXPLAIN ANALYZE, QBit 벡터 검색, dpsub 조인 재정렬도 이번 LTS에 통합된다.
1. 왜 이 LTS 업그레이드가 무겁게 느껴지는가
LTS는 2주 릴리스 주기에서 약 6개월에 한 번 지정된다. 26.3 LTS에서 26.8 LTS로 넘어가면 5개 버전(26.4~26.8)을 동시에 건너뛴다. ClickHouse의 브레이킹 체인지는 버전마다 소수씩 쌓여 총 57개가 된다.
가장 자주 언급되는 변화는 두 가지다.
S3 자격증명 처리 변경 (26.6): s3.access_key_id와 s3.secret_access_key 설정 키의 우선순위 순서가 바뀌었다. 구성 파일에 자격증명을 명시하지 않고 IAM 역할에 의존하던 환경에서는 동작이 달라질 수 있다.
EXPLAIN 출력 포맷 변경 (26.7): EXPLAIN ANALYZE가 새로 추가되면서 EXPLAIN 출력 구조가 일부 바뀌었다. 자동화 스크립트나 모니터링 도구가 EXPLAIN 결과를 파싱한다면 검토가 필요하다.
업그레이드 전 체크리스트:
SELECT * FROM system.settings WHERE changed = 1— 변경된 설정값 목록 확인SHOW CREATE TABLE결과를 백업해 스키마 이상 여부 비교- 스테이징 환경에서 프로덕션 쿼리 샘플 10~20개 실행, 실행 계획 비교
2. Parquet/S3 최적화: 11배 절감의 원리
26.8에서 가장 즉각적인 효과를 내는 변화는 S3에 저장된 Parquet 파일 쿼리 최적화다. 두 가지 메커니즘이 결합된다.
2-1. ORDER BY + LIMIT 열 지연 로딩
기존 동작:
SELECT col_a, col_b, col_c, col_d
FROM s3('s3://bucket/data/*.parquet', Parquet)
ORDER BY col_a
LIMIT 10026.7 이전에는 Parquet 파일에서 모든 컬럼(col_a, col_b, col_c, col_d)을 전부 읽은 후 정렬하고 LIMIT을 적용했다.
26.8 신규 동작:
- 1단계:
col_a(ORDER BY 기준 열)만 먼저 읽어 상위 100개 행의 Row Group와 행 번호 파악 - 2단계: 확인된 100개 행에 해당하는
col_b,col_c,col_d만 읽음
결과: 1억 행 S3 Parquet 쿼리에서 4.9초/5.85GB → 1.7초/0.53GB (데이터 읽기량 11배 감소).
5.85 GB
~0.18 GB
0.35 GB
2-2. Row Group 스킵: 등호·IN 조건
Parquet 파일은 각 Row Group의 컬럼 최소/최대 통계를 가진다. 26.8은 이를 활용해 =와 IN 조건에서 해당 값이 없음이 확실한 Row Group 전체를 건너뛴다.
-- 이 쿼리에서 26.8은 Row Group min/max로 불필요한 그룹 스킵
SELECT count() FROM s3_table WHERE user_id = 12345같은 컬럼 기반 쿼리에서 1.82초 → 1.22초 개선이 보고됐다. 카디널리티가 높고 데이터가 정렬된 컬럼일수록 효과가 크다.
3. Adaptive 병렬 GROUP BY
대규모 집계에서 병렬 GROUP BY는 핵심 성능 요소다. 26.8 이전에는 방법이 고정됐다: 모든 스레드가 독립 해시 테이블을 만들고 마지막에 병합한다. 데이터 분포에 따라 이 접근법이 최적이 아닌 경우가 많았다.
26.8의 Adaptive GROUP BY는 쿼리 실행 중 실시간으로 두 가지 전략 사이를 전환한다:
| 전략 | 언제 유리한가 |
|---|---|
| 독립 해시 테이블 + 병합 | 고 카디널리티, 그룹 수 많음 |
| 공유 해시 테이블 | 저 카디널리티, 그룹 수 적음 |
초기 샘플링으로 카디널리티를 추정한 후 전략을 선택한다. 실제 분포가 예상과 다를 경우 중간에 전략을 바꿀 수도 있다. 대부분의 운영 환경에서 별도 설정 없이 자동으로 동작한다.
4. INSERT 시 통계 자동 생성 (소형 테이블)
26.8은 소형 테이블에 데이터를 INSERT할 때 쿼리 최적화에 쓰이는 컬럼 통계를 자동으로 생성한다. 기존에는 ANALYZE TABLE 명령을 별도로 실행해야 했다.
이 통계는 옵티마이저가 조인 순서, 필터 선택도(selectivity), 집계 방식을 결정할 때 사용한다. 소형 테이블(기본 기준: 수백만 행 이하)은 통계 생성 비용이 낮아 INSERT 시 자동화가 실용적이다.
대형 테이블은 여전히 수동 ANALYZE TABLE이 권장된다. INSERT마다 통계 재생성이 부담이 될 수 있기 때문이다.
5. 백그라운드 쿼리 실행: "Fire and Forget"
26.8의 운영자에게 가장 유용한 신기능 중 하나다. 특히 장시간 실행되는 배치 작업이나 정기 집계에 적합하다.
-- 쿼리를 제출하고 즉시 반환 (결과 기다리지 않음)
INSERT INTO daily_aggregates
SELECT date_trunc('day', ts), count(), sum(revenue)
FROM events
WHERE ts >= today() - 1
SETTINGS run_in_background = 1;동작 방식:
- 클라이언트가 쿼리를 제출하면 서버가
query_id를 즉시 반환 - 연결이 끊어져도 서버에서 쿼리가 계속 실행
- 진행 상황은
system.processes또는 쿼리 로그에서 확인 가능
-- 진행 상황 확인
SELECT query_id, elapsed, read_rows, written_rows
FROM system.processes
WHERE query_id = '<returned_query_id>';
-- 완료 후 결과 확인
SELECT * FROM system.query_log
WHERE query_id = '<returned_query_id>' ORDER BY event_time DESC LIMIT 1;주의사항:
- 실패해도 클라이언트에 에러가 즉시 전달되지 않는다 — 반드시 query log 모니터링 필요
kill_query로 취소 가능하지만 실행 중 노드 재시작 시 쿼리가 소실된다- 클러스터 환경에서 분산 쿼리에도 적용 가능하지만 각 샤드가 독립적으로 처리
6. 시간 제한 사용자 자격증명
보안 운영에서 자주 필요한 기능이 추가됐다. 임시 접근 권한을 설정된 기간 후 자동 만료시킬 수 있다.
-- 30일 후 만료되는 사용자 생성
CREATE USER bot_user
IDENTIFIED BY 'strong_password'
VALID FOR INTERVAL 30 DAY;
-- 특정 날짜까지 유효
CREATE USER temp_analyst
IDENTIFIED BY 'temp_pass'
VALID UNTIL '2026-12-31 23:59:59';
-- 만료 일시 확인
SELECT name, valid_until FROM system.users WHERE name IN ('bot_user', 'temp_analyst');사용 사례:
- CI/CD 파이프라인 전용 서비스 계정 (배포 기간 동안만 유효)
- 외부 감사자나 컨설턴트의 일시적 읽기 권한
- 분기별로 교체되는 데이터 파이프라인 접근 자격증명
7. 26.7에서 통합된 주요 기능 요약
26.8 LTS에는 26.7의 모든 기능이 포함된다. 26.3 LTS에서 바로 넘어오는 팀을 위한 요약:
| 기능 | 설명 |
|---|---|
| EXPLAIN ANALYZE | 실제 실행 후 논리 플랜에 측정값 주석 — 쿼리 병목을 정확히 진단 |
| QBit 벡터 검색 | Int8 QBit, Matryoshka 임베딩용 차원 스트라이드, AdamR 로테이션 |
| dpsub 조인 재정렬 | 동적 프로그래밍 기반 다중 테이블 조인 순서 최적화 |
| Web UI 대폭 개선 | 탭, 파라미터, 스키마 자동완성, 컬럼 히트맵/바 차트 |
| GROUP BY ORDER BY LIMIT 최적화 | 상위 K행만 정렬하는 조기 종료 전략 |
| 구문 인식 구문 검색 | 위치 인식 구문 검색 (Position-aware phrase search) |
8. 업그레이드 권장 절차
1. 스테이징 환경 재현
- 프로덕션 스키마 + 데이터 샘플 10~20%로 스테이징 구성
- 26.3 LTS → 26.8 LTS 업그레이드 테스트
2. 설정값 검토
SELECT * FROM system.settings WHERE changed = 1;
-- S3 자격증명 관련 설정 특히 확인
3. 주요 쿼리 벤치마크
-- EXPLAIN으로 실행 계획 변화 비교
-- 특히 Parquet/S3 조회 쿼리, 대형 GROUP BY 쿼리
4. 롤링 업그레이드 (ClickHouse 클러스터)
- 레플리카 단위로 순차 업그레이드
- 각 단계에서 system.replicas의 복제 지연 모니터링
- 전 노드 업그레이드 완료 전까지 브레이킹 기능 비활성화 고려
5. 사후 검증
SELECT count() FROM system.errors WHERE last_error_time > now() - INTERVAL 1 HOUR;
-- 에러 패턴 모니터링