ClickHouse, 수십 테라바이트 데이터도 빠르게 처리하는 비결!

by DD
4개월 전
조회수 8

ClickHouse는 대용량 데이터 처리를 위해 설계되었으며, 문자열 비교 및 해싱(Hashing) 과정에서 성능 최적화 기법을 사용함

문자열 길이에 따라 Short, Medium, Long 세 가지 범주로 나누어, 각 길이에 맞는 SIMD(Single Instruction, Multiple Data) 명령어를 활용하여 비교 수행

LowCardinality(String) 타입을 통해 고유값(Unique Value) 기반의 데이터 격리 아키텍처(Data Isolation Architecture)를 구현하여 쿼리 성능을 향상시킴

LZ4, zstd 등의 압축 알고리즘을 사용하여 디스크 I/O 병목 현상을 해결하고, 컬럼 기반 데이터 저장 방식을 통해 압축 효율을 극대화함

문자열 비교 최적화: Short, Medium, Long

ClickHouse는 문자열 길이에 따라 Short, Medium, Long 세 가지 방식으로 문자열 비교를 수행한다. 특히, Short string의 경우, CPU의 분기 예측(Branch Prediction)을 활용하여 성능을 향상시킨다. 구체적으로, 16바이트 미만의 문자열을 겹쳐서 읽는 방식으로 비교하여 분기 예측 실패를 최소화한다. Medium string은 SIMD 명령어를 사용하여 16바이트 단위로 비교하며, Long string은 64바이트 단위로 처리한다. 이러한 방식은 대용량 데이터 처리(Large-scale Data Processing)에 필수적인 최적화 기법이다.

SIMD 명령어 활용: 병렬 처리 극대화

ClickHouse는 SIMD(Single Instruction, Multiple Data) 명령어를 활용하여 문자열 비교 및 해싱(Hashing) 성능을 극대화한다. 특히, SSE2 또는 Arm Neon을 지원하는 CPU에서 16바이트 단위로 병렬 비교를 수행한다. Long string의 경우, 64바이트를 8개의 SIMD 레지스터에 로드하여 동시에 비교한다. 이러한 병렬 처리 기법은 CPU 자원 활용률(CPU Resource Utilization)을 높여 전체적인 쿼리 성능을 향상시키는 데 기여한다.

LowCardinality(String) 타입: 데이터 격리 아키텍처(Data Isolation Architecture)

ClickHouse는 LowCardinality(String) 타입을 사용하여 고유 문자열 값을 정수 ID로 매핑한다. 이 방식은 문자열 비교 대신 정수 비교를 수행하므로 쿼리 속도를 크게 향상시킨다. 특히, 필터링(Filtering) 및 그룹화(Grouping) 연산에서 효과적이다. 이러한 데이터 격리 아키텍처(Data Isolation Architecture)는 고유값의 개수가 제한적인 경우에 최적의 성능을 제공하며, 데이터베이스 성능 최적화의 핵심 전략 중 하나로 꼽힌다.

압축 알고리즘: 디스크 I/O 병목 현상 해결

ClickHouse는 LZ4, zstd와 같은 압축 알고리즘을 사용하여 디스크 I/O 병목 현상을 완화한다. 압축을 통해 디스크에서 읽어야 하는 데이터 양을 줄여 전체적인 쿼리 성능을 향상시킨다. 특히, 컬럼 기반 데이터 저장 방식은 동일한 데이터 타입의 값을 연속적으로 저장하므로 압축 효율을 극대화한다. 이러한 압축 기법은 대용량 데이터 처리(Large-scale Data Processing) 환경에서 필수적인 요소이며, 데이터베이스 성능 향상에 중요한 역할을 한다.

How ClickHouse handles strings