QuestDB, WINDOW JOIN 연산자 병렬 처리로 25배 성능 향상!

by DD
3주 전
조회수 6

QuestDB는 시간 기반 데이터베이스(Time-Series Database)의 WINDOW JOIN 연산자 병렬 처리 및 SIMD(Single Instruction, Multiple Data) 벡터화를 통해 성능을 극대화함.

기존 SQL 쿼리(SQL Query)를 WINDOW JOIN 연산자로 대체하여 쿼리 단순화(Query Simplification)성능 향상(Performance Improvement)을 달성함.

벤치마크 결과, 다른 데이터베이스(Timescale, DuckDB, ClickHouse) 대비 최대 25배 빠른 성능(25x Faster Performance)을 보이며, 데이터 처리 속도를 혁신함.

WINDOW JOIN 연산자 최적화: 병렬 처리 및 SIMD

QuestDB는 WINDOW JOIN 연산자(Operator)를 통해 시간 기반 데이터 처리 성능을 향상시켰다. 특히, 데이터 레벨 병렬 처리(Data-Level Parallelism)를 통해 LHS(Left-Hand Side) 테이블을 페이지 프레임(Page Frame) 단위로 분할하여 각 워커 스레드(Worker Thread)가 독립적으로 처리하도록 설계했다. 또한, SIMD(Single Instruction, Multiple Data) 벡터화(Vectorization)를 활용하여, 저 카디널리티(Low-Cardinality) 조인(Join) 시, 연속적인 메모리 버퍼(Contiguous Buffer)에 값을 복사하여 SIMD 커널(Kernel)을 적용, 평균(avg), 최소(min), 최대(max) 등의 연산을 가속화했다.

저 카디널리티 조인(Low-Cardinality Join)을 위한 고속 경로

QuestDB는 저 카디널리티 등가 조인(Low-Cardinality Equality Join)과 벡터화 가능한 집계 함수(Vectorizable Aggregate Functions)를 위해 특별한 고속 경로(Fast Path)를 구현했다. 이 경로는 RHS(Right-Hand Side) 값을 키별(Per-Key) 연속 버퍼에 복사하여 SIMD 커널이 윈도우 슬라이스(Window Slice)에 직접 적용될 수 있도록 한다. SIMD(Single Instruction, Multiple Data) 최적화(Optimization)는 AVX2를 활용하여, 8개의 double 값을 한 번에 처리하며, 메모리 접근 패턴을 최적화하여 성능을 극대화한다. 이 방식은 일반적인 쿼리보다 훨씬 빠른 성능을 제공한다.

벤치마크 결과 및 타 데이터베이스 비교

벤치마크 결과에 따르면, QuestDB의 병렬 및 SIMD 기반 WINDOW JOIN은 ClickHouse의 25배, QuestDB의 단일 스레드(Single-Thread) 기반 구현보다 5배 빠른 성능을 보였다. 다른 데이터베이스(Timescale, DuckDB)는 WINDOW JOIN에 해당하는 연산자가 없어, 쿼리 재작성(Query Rewrite)을 통해 벤치마크를 진행했다. 특히, Timescale은 range join과 GROUP BY를 사용했지만, 메모리 부족으로 인해 벤치마크가 중단되었다. 이러한 결과는 QuestDB의 전용 연산자(Dedicated Operator), 데이터 레벨 병렬 처리(Data-Level Parallelism), 그리고 연속적인 슬라이스(Contiguous Slice)를 활용한 SIMD 커널(SIMD Kernel)의 조합이 성능 향상에 기여했음을 보여준다.

WINDOW JOIN의 활용 사례 및 향후 계획

WINDOW JOIN은 시계열 데이터(Time-Series Data) 처리에서 다양한 활용 사례를 가진다. 특히, 거래 데이터(Trades Data)와 시세 데이터(Quotes Data)를 결합하는 데 효과적이며, 윈도우 경계(Window Bounds)는 상수, LHS 열 또는 표현식으로 정의될 수 있다. QuestDB는 ASOF JOIN 이후 WINDOW JOIN을 구현했으며, HORIZON JOIN과 같은 다른 시간 관련 연산자(Temporal Operators)를 지속적으로 개발할 예정이다. QuestDB는 커뮤니티의 피드백을 적극적으로 수렴하며, 지속적인 성능 개선을 추구하고 있다.

How we made WINDOW JOIN parallel and vectorized