Skip to main content
ClickHouse 쿼리 성능의 핵심 요소 중 하나는 압축입니다. 디스크에 저장되는 데이터가 적을수록 I/O가 줄어들고 쿼리와 삽입이 더 빨라집니다. CPU 측면에서 압축 알고리즘에 따른 오버헤드는 대부분의 경우 I/O 감소 효과로 충분히 상쇄됩니다. 따라서 ClickHouse 쿼리 성능을 높이려면 먼저 데이터 압축 개선에 집중해야 합니다.
ClickHouse가 데이터를 매우 효율적으로 압축하는 이유는 이 글을 읽어보시기를 권장합니다. 간단히 말해, ClickHouse는 컬럼 지향 데이터베이스로서 값을 컬럼 순서로 저장합니다. 이 값들이 정렬되면 동일한 값이 서로 인접하게 배치되고, 압축 알고리즘은 데이터의 연속적인 패턴을 활용합니다. 여기에 더해 ClickHouse는 코덱과 세밀한 데이터 타입을 제공하므로 압축을 한층 쉽게 최적화할 수 있습니다.
ClickHouse의 압축에는 3가지 주요 요인이 영향을 줍니다.
  • 순서 지정 키
  • 데이터 타입
  • 사용하는 코덱
이 모든 항목은 스키마를 통해 구성됩니다.

압축을 최적화하기 위한 적절한 데이터 타입 선택

Stack Overflow 데이터셋을 예시로 사용하겠습니다. posts 테이블에 대해 다음 스키마의 압축 통계를 비교해 보겠습니다.
  • posts - 타입 최적화가 적용되지 않았고 순서 지정 키도 없는 스키마입니다.
  • posts_v3 - 각 컬럼에 적절한 타입과 비트 크기를 적용하고, 순서 지정 키 (PostTypeId, toDate(CreationDate), CommentCount)를 사용하는 타입 최적화 스키마입니다.
다음 쿼리를 사용하면 각 컬럼의 현재 압축된 크기와 압축되지 않은 크기를 측정할 수 있습니다. 먼저 순서 지정 키가 없는 초기 최적화 스키마 posts의 크기를 살펴보겠습니다.
compressed_size 또는 uncompressed_size 값이 0으로 표시된다면, 이는 파트 유형이 wide가 아니라 compact이기 때문일 수 있습니다(system.parts의 [part_type] 설명 참조). 파트 포맷은 설정 min_bytes_for_wide_partmin_rows_for_wide_part로 제어됩니다. 즉, 삽입된 데이터로 생성된 파트가 앞서 언급한 설정값을 초과하지 않으면, 해당 파트는 wide가 아니라 compact로 생성되며 compressed_size 또는 uncompressed_size 값이 표시되지 않습니다.이를 보여주기 위해 다음 예를 살펴보겠습니다:
쿼리
응답
여기서는 압축된 크기와 압축되지 않은 크기를 모두 보여줍니다. 둘 다 중요합니다. 압축된 크기는 디스크에서 읽어야 하는 데이터 양에 해당하므로, 쿼리 성능과 저장 비용을 위해 가능한 한 줄이는 것이 좋습니다. 이 데이터는 읽기 전에 압축 해제되어야 합니다. 이때 압축되지 않은 크기는 사용된 데이터 타입에 따라 달라집니다. 이 크기를 줄이면 쿼리의 메모리 오버헤드와 쿼리에서 처리해야 하는 데이터 양이 감소하여 캐시 활용도가 높아지고, 궁극적으로 쿼리 시간도 단축됩니다.
위 쿼리는 system 데이터베이스의 columns 테이블을 사용합니다. 이 데이터베이스는 ClickHouse가 관리하며, 쿼리 성능 메트릭부터 백그라운드 클러스터 로그까지 유용한 정보가 풍부하게 담겨 있습니다. 더 자세히 알고 싶다면 “System Tables and a Window into the Internals of ClickHouse”와 관련 글[1][2]을 참고하시기 바랍니다.
테이블의 전체 크기를 요약하려면 위 쿼리를 다음과 같이 단순화할 수 있습니다:
최적화된 유형과 순서 지정 키가 적용된 테이블인 posts_v3에 대해 같은 쿼리를 실행해 보면, 압축되지 않은 크기와 압축된 크기가 크게 감소한 것을 확인할 수 있습니다.
전체 컬럼 분석을 보면, 압축 전에 데이터를 정렬하고 적절한 타입을 사용하면 Body, Title, Tags, CreationDate 컬럼에서 상당한 절감 효과를 얻을 수 있음을 알 수 있습니다.

적절한 컬럼 압축 코덱 선택하기

컬럼 압축 코덱을 사용하면 각 컬럼을 인코딩하고 압축할 때 사용하는 알고리즘(및 해당 설정)을 변경할 수 있습니다. 인코딩과 압축은 같은 목표, 즉 데이터 크기 축소를 위해 사용되지만 작동 방식은 조금 다릅니다. 인코딩은 데이터 타입의 특성을 활용해 함수에 따라 값에 매핑을 적용하고 이를 변환합니다. 반면 압축은 바이트 수준에서 데이터를 압축하는 범용 알고리즘을 사용합니다. 일반적으로는 압축 전에 먼저 인코딩이 적용됩니다. 또한 인코딩과 압축 알고리즘마다 효과적인 값 분포가 다르므로, 데이터의 특성을 이해해야 합니다. ClickHouse는 다양한 코덱과 압축 알고리즘을 지원합니다. 다음은 중요도 순으로 정리한 몇 가지 권장 사항입니다: 추가 옵션은 여기에서 확인하십시오. 아래에서는 Id, ViewCount, AnswerCountDelta 코덱을 지정합니다. 이 값들이 순서 지정 키와 선형적인 상관관계가 있어 Delta 인코딩의 이점을 얻을 것이라고 가정합니다.
이러한 컬럼의 압축 개선 효과는 아래와 같습니다.

ClickHouse Cloud의 압축

ClickHouse Cloud에서는 기본적으로 ZSTD 압축 알고리즘(기본값: 1)을 사용합니다. 이 알고리즘의 압축 속도는 압축 수준에 따라 달라질 수 있으며(수준이 높을수록 느려짐), 압축 해제는 일관되게 빠르다는 장점이 있습니다(변동 폭은 약 20%). 또한 병렬화가 가능하다는 이점도 있습니다. 과거 테스트 결과를 보면, 이 알고리즘은 대체로 충분히 효과적이며 코덱과 함께 사용하는 LZ4보다 더 나은 성능을 보이기도 합니다. 대부분의 데이터 타입과 데이터 분포에서 효과적이므로 범용 기본값으로 적절하며, 따라서 별도의 최적화가 없어도 초기 압축 설정만으로도 이미 뛰어난 성능을 제공합니다.
마지막 수정일 2026년 7월 3일