LLM WikiAccess-protected knowledge portal
← 스터디 홈
162편 · 약 14분

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_ids3.secret_access_key 설정 키의 우선순위 순서가 바뀌었다. 구성 파일에 자격증명을 명시하지 않고 IAM 역할에 의존하던 환경에서는 동작이 달라질 수 있다.

EXPLAIN 출력 포맷 변경 (26.7): EXPLAIN ANALYZE가 새로 추가되면서 EXPLAIN 출력 구조가 일부 바뀌었다. 자동화 스크립트나 모니터링 도구가 EXPLAIN 결과를 파싱한다면 검토가 필요하다.

업그레이드 전 체크리스트:

  1. SELECT * FROM system.settings WHERE changed = 1 — 변경된 설정값 목록 확인
  2. SHOW CREATE TABLE 결과를 백업해 스키마 이상 여부 비교
  3. 스테이징 환경에서 프로덕션 쿼리 샘플 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 100

26.7 이전에는 Parquet 파일에서 모든 컬럼(col_a, col_b, col_c, col_d)을 전부 읽은 후 정렬하고 LIMIT을 적용했다.

26.8 신규 동작:

  1. 1단계: col_a(ORDER BY 기준 열)만 먼저 읽어 상위 100개 행의 Row Group와 행 번호 파악
  2. 2단계: 확인된 100개 행에 해당하는 col_b, col_c, col_d만 읽음

결과: 1억 행 S3 Parquet 쿼리에서 4.9초/5.85GB → 1.7초/0.53GB (데이터 읽기량 11배 감소).

26.7 이전 (전체 읽기)
S3 Parquet 파일
↓ 모든 열 다운로드
col_a + col_b + col_c + col_d
5.85 GB
↓ 정렬 → LIMIT 100
결과 100행
vs
26.8 (지연 로딩)
S3 Parquet 파일
↓ 1단계: col_a만 읽기
ORDER BY 열만
~0.18 GB
↓ 상위 100행 식별
↓ 2단계: 해당 행만
0.35 GB
↓ 합계 0.53 GB
결과 100행
Parquet 열 지연 로딩: 2단계 읽기 최적화

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;

동작 방식:

  1. 클라이언트가 쿼리를 제출하면 서버가 query_id를 즉시 반환
  2. 연결이 끊어져도 서버에서 쿼리가 계속 실행
  3. 진행 상황은 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;
   -- 에러 패턴 모니터링

References