LLM WikiAccess-protected knowledge portal
← 스터디 홈
80편 · 약 12분

CrateDB 6.4: LTTB 시계열 다운샘플링·GROUP BY 최적화·PostgreSQL 호환성 확장

분산 SQL과 시계열의 교차점

CrateDB는 공유 없는(shared-nothing) 분산 아키텍처 위에 PostgreSQL 와이어 프로토콜을 얹은 SQL 데이터베이스다. 내부 인덱싱 레이어는 Elasticsearch와 동일한 Lucene을 사용하지만, 쿼리 인터페이스는 표준 SQL이다. 이 구조 덕분에 OLTP 수준의 쿼리와 로그·시계열 같은 문서형 대용량 데이터를 하나의 클러스터에서 동시에 다룰 수 있다.

2026년 7월 20일 배포된 CrateDB 6.4.0은 규모가 큰 세 가지 변화를 가져왔다. 시계열 데이터를 렌더링용으로 줄일 때 쓰는 LTTB 알고리즘의 SQL 집계 함수화, GROUP BY 성능 대폭 개선, PostgreSQL 호환성 완성이다. 각각이 독립적인 운영 시나리오를 바꾼다.

CrateDB의 분산 구조

CrateDB 클러스터는 수평 확장 노드로 구성된다. 테이블 데이터는 샤드(shard) 단위로 분산되며, 각 샤드는 Lucene 인덱스로 저장된다. 쿼리는 SQL 레이어에서 실행 계획으로 변환되어 관련 샤드가 있는 노드에 병렬로 분산된 다음, 코디네이터 노드에서 부분 결과를 합산한다.

클라이언트 PostgreSQL 와이어 프로토콜 코디네이터 노드 SQL 파서 실행 계획 수립 부분 결과 합산 데이터 노드 A Lucene 샤드 0, 1 GROUP BY 로컬 처리 데이터 노드 B Lucene 샤드 2, 3 LTTB 부분 집계 데이터 노드 C Lucene 샤드 4, 5 blake3 / varchar(n) 6.4 주요 변경 • LTTB 집계 함수 • GROUP BY 최적화 (문자열 키 140%↑) • to_char() 개선 (서수·리터럴·속도) • pg_catalog.pg_user • DATE + interval • ALTER REPOSITORY • blake3() 함수 • varchar(n) 집계 수정 * 각 샤드 = Lucene 인덱스 | Lucene 10 기반 (6.0부터)
CrateDB 6.4 — 분산 SQL 아키텍처와 주요 변경점

PostgreSQL 와이어 프로토콜을 지원하므로 psql, JDBC, SQLAlchemy, Grafana의 PostgreSQL 데이터소스 플러그인을 그대로 쓸 수 있다. 클러스터 규모가 커도 쿼리 인터페이스는 단일 PostgreSQL처럼 보인다.

LTTB: 시계열 데이터를 형태 보존으로 줄이는 집계 함수

왜 단순 다운샘플링이 부족한가

시계열 대시보드에서 1시간짜리 차트를 그릴 때 1초 간격 데이터가 3,600개 있다면, 브라우저가 그릴 수 있는 픽셀 수를 훨씬 초과한다. 단순히 N번째 샘플만 고르는 방식(stride sampling)은 스파이크나 변화점을 놓치기 쉽다.

Largest Triangle Three Buckets(LTTB) 알고리즘은 이 문제를 기하학적으로 해결한다. 데이터를 동일한 크기의 버킷으로 나누고, 각 버킷에서 앞 버킷의 대표점과 뒤 버킷의 평균점을 두 꼭짓점으로 하는 삼각형의 넓이가 가장 큰 점을 선택한다. 넓이가 가장 큰 점은 트렌드 방향 전환이나 이상치를 나타낼 가능성이 높기 때문에, 원본 곡선의 시각적 형태를 최대한 보존한다.

SQL 사용법

CrateDB 6.4는 이 알고리즘을 단일 집계 함수로 내장했다.

SELECT
  largest_triangle_three_buckets(ts, value, 200)
FROM sensor_readings
WHERE sensor_id = 42
  AND ts BETWEEN '2026-07-01' AND '2026-07-31';

세 번째 인수 200이 목표 포인트 수다. 반환값은 (x, y) 쌍의 배열이며, Grafana 같은 시각화 도구에서 바로 렌더링할 수 있다.

이전에는 동일한 작업을 애플리케이션 레이어에서 Python이나 TypeScript로 구현해야 했다. 데이터를 모두 읽어서 메모리에 올린 뒤 줄이는 방식이라 네트워크 전송과 메모리 비용이 컸다. largest_triangle_three_buckets()는 샤드 단위로 부분 집계를 수행한 뒤 코디네이터에서 합산하므로 데이터가 분산되어 있어도 단일 SQL로 완결된다.

LTTB가 적합한 경우

  • IoT 센서 데이터를 대시보드용으로 렌더링할 때
  • 1분 이상 집계로는 원본 스파이크가 사라지는 경우
  • 수십억 개의 포인트를 가진 테이블에서 400~1,000개 수준으로 줄여야 할 때

date_bin() 집계보다 포인트 수 제어가 더 중요하고, 이상치 보존이 필요한 시나리오라면 LTTB가 더 적합하다.

GROUP BY 최적화: 문자열 키에서 140% 빠른 이유

CrateDB 6.4는 특정 조건에서 GROUP BY 실행 경로를 개선했다. 구체적으로는 WHERE 절 없이 문자열 컬럼으로 GROUP BY할 때 최대 140% 빠른 처리 속도를 보인다.

기존 실행 경로는 Lucene의 TermsEnum을 순회하면서 문자열 값을 Java 힙 기반 해시맵으로 적재했다. 문자열 디코딩과 객체 생성 오버헤드가 매 행마다 발생했다.

최적화된 경로는 Lucene의 SortedDocValues 를 직접 활용한다. SortedDocValues는 문자열을 사전식으로 정렬한 뒤 정수 ordinal로 인덱싱하므로, GROUP BY 연산이 문자열 대신 정수 비교와 카운트로 단순화된다. WHERE 절이 없으면 전체 세그먼트를 스캔하기 때문에 이 경로를 가장 효과적으로 쓸 수 있다.

-- 이 패턴에서 6.4가 특히 빠름
SELECT region, status, COUNT(*) AS cnt
FROM orders
GROUP BY region, status;

로그나 이벤트 테이블에서 카테고리 컬럼(상태, 지역, 이벤트 타입)으로 집계하는 쿼리가 많다면 6.4 업그레이드만으로 응답 시간이 줄어드는 경우가 있다.

PostgreSQL 호환성 개선

to_char() 세 가지 변화

to_char()는 숫자와 날짜를 포맷 문자열로 변환하는 함수다. 6.4에서 세 가지가 달라졌다.

  1. 서수 접미사(ordinal suffix): TH 또는 th 수식어를 숫자 포맷에 붙이면 서수를 반환한다.

``sql SELECT to_char(3, 'FMDDth'); -- → '3rd' SELECT to_char(1, 'FMDDTh'); -- → '1st' ``

  1. 리터럴 문자 인용: 포맷 문자열 안의 리터럴을 큰따옴표(")로 감쌀 수 있다. PostgreSQL 표준 동작과 일치한다.

``sql SELECT to_char(NOW(), '"오늘은 "YYYY"년 "MM"월 "DD"일"'); -- → '오늘은 2026년 07월 20일' ``

  1. 속도 개선: 내부 포맷 파싱 로직을 재작성하여 약 25% 빠르게 처리된다. to_char()를 집계 쿼리 안에서 대량으로 쓰는 경우 의미 있는 차이가 생긴다.

pg_catalog.pg_user 뷰 추가

많은 PostgreSQL 호환 도구가 사용자 목록 조회에 pg_catalog.pg_user를 참조한다. 6.4 이전에는 이 뷰가 없어 해당 도구에서 에러가 발생하거나 별도 설정이 필요했다. 이제 뷰가 내장됐으므로 이 문제가 사라진다.

DATE + interval 산술

PostgreSQL에서는 DATE '2026-07-01' + INTERVAL '7 days'DATE 타입을 반환한다. CrateDB 6.4 이전에는 이 연산이 TIMESTAMP를 반환하여 타입 불일치 오류를 일으켰다. 6.4부터 PostgreSQL 표준과 동일하게 DATE를 반환한다.

-- 6.4 이전: TIMESTAMP 반환 → 타입 비교 오류 가능
-- 6.4 이후: DATE 반환
SELECT DATE '2026-07-01' + INTERVAL '7 days';
-- → 2026-07-08 (DATE 타입)

날짜 범위 조건을 파라미터로 받는 쿼리에서 타입 캐스팅 없이 동작하게 된다.

운영 편의 기능

ALTER REPOSITORY

백업 설정을 변경하려면 기존에는 리포지터리를 삭제하고 다시 만들어야 했다. 6.4부터 ALTER REPOSITORY 문으로 기존 백업 리포지터리의 설정을 그 자리에서 수정할 수 있다.

ALTER REPOSITORY my_s3_backup SET (
  "bucket" = 'new-cratedb-backups',
  "region" = 'ap-northeast-2'
);

리포지터리를 재생성하면 기존 스냅샷 메타데이터와의 연결이 끊어질 수 있는데, ALTER REPOSITORY는 그 위험 없이 설정만 바꾼다.

blake3() 스칼라 함수

SELECT blake3('hello world');
-- → 'd74981efa70a0c880b8d8c1985d075dbcbf679b99a5f9914e5aaf96b831a9e24'

BLAKE3는 SHA-256보다 빠르면서 강한 보안 속성을 가진 해시 알고리즘이다. CrateDB에서 컨텐츠 기반 중복 제거, 파일 무결성 확인, 행 핑거프린팅 등에 사용할 수 있다.

varchar(n) 집계 동작 수정

이전 버전에서 varchar(n) 컬럼에 MAX()STRING_AGG() 같은 집계 함수를 적용하면 내부 처리가 text 타입과 달라 일부 쿼리에서 예기치 않은 결과가 나왔다. 6.4부터 varchar(n)이 집계 함수 안에서 text와 동일하게 처리된다. 주로 ORM이나 Hibernate 같은 도구가 varchar(n)을 자동 생성할 때 문제를 일으켰다.

업그레이드 시 확인할 것

항목변화필요한 조치
to_char() 결과서수 접미사, 리터럴 인용 지원 추가기존 포맷 문자열이 " 를 포함하는 경우 의미가 바뀜 — 테스트 필요
DATE + intervalDATE 반환 (이전: TIMESTAMP)결과 타입에 의존하는 애플리케이션 로직 확인
varchar(n) 집계text와 동일하게 처리이전 동작을 의도적으로 사용하지 않았다면 무해
GROUP BY 최적화문자열 키, WHERE 없는 경우만 적용실행 계획 변경 가능 — EXPLAIN으로 확인 권장

largest_triangle_three_buckets()는 신규 기능이므로 기존 코드와 충돌하지 않는다. ALTER REPOSITORY도 마찬가지다.

요약

기능핵심
LTTB 집계largest_triangle_three_buckets(x, y, n) — 시계열을 형태 보존으로 n개로 줄임
GROUP BY 속도문자열 키, WHERE 없는 경우 최대 140% 개선
to_char()서수 접미사 지원, 리터럴 인용, ~25% 속도 향상
pg_catalog.pg_user다수 PostgreSQL 호환 도구와의 통합 에러 해소
DATE + intervalPostgreSQL 표준대로 DATE 반환
ALTER REPOSITORY백업 리포지터리 설정을 삭제 없이 수정
blake3()BLAKE3 해시 스칼라 함수
varchar(n)집계에서 text와 동일하게 동작

CrateDB 6.4는 단일 기능 릴리스가 아니라 시계열 처리, SQL 호환성, 운영 편의를 각각 실질적으로 끌어올린 릴리스다. 특히 LTTB 집계는 Grafana나 Superset과 함께 쓰는 IoT·관측성 파이프라인에서 애플리케이션 레이어 코드를 줄이는 직접적인 이유가 된다.

References

  • https://cratedb.com/blog/cratedb-6-4-0-release
  • https://github.com/crate/crate/blob/master/CHANGES.txt
  • Steinarsson, S. (2013). Downsampling Time Series for Visual Representation. University of Iceland. (LTTB 원 논문)
  • https://cratedb.com/docs/crate/reference/en/latest/sql/statements/alter-repository.html
  • https://cratedb.com/docs/crate/reference/en/latest/general/builtins/aggregate.html