ClickHouse가 데이터를 매우 효율적으로 압축하는 이유는 이 글을 읽어보시기를 권장합니다. 간단히 말해, ClickHouse는 컬럼 지향 데이터베이스로서 값을 컬럼 순서로 저장합니다. 이 값들이 정렬되면 동일한 값이 서로 인접하게 배치되고, 압축 알고리즘은 데이터의 연속적인 패턴을 활용합니다. 여기에 더해 ClickHouse는 코덱과 세밀한 데이터 타입을 제공하므로 압축을 한층 쉽게 최적화할 수 있습니다.ClickHouse의 압축에는 3가지 주요 요인이 영향을 줍니다.
- 순서 지정 키
- 데이터 타입
- 사용하는 코덱
압축을 최적화하기 위한 적절한 데이터 타입 선택
posts 테이블에 대해 다음 스키마의 압축 통계를 비교해 보겠습니다.
posts- 타입 최적화가 적용되지 않았고 순서 지정 키도 없는 스키마입니다.posts_v3- 각 컬럼에 적절한 타입과 비트 크기를 적용하고, 순서 지정 키(PostTypeId, toDate(CreationDate), CommentCount)를 사용하는 타입 최적화 스키마입니다.
posts의 크기를 살펴보겠습니다.
compact 파트와 wide 파트에 대한 참고 사항
compact 파트와 wide 파트에 대한 참고 사항
compressed_size 또는 uncompressed_size 값이 0으로 표시된다면, 이는
파트 유형이 wide가 아니라 compact이기 때문일 수 있습니다(system.parts의 [part_type] 설명 참조).
파트 포맷은 설정 min_bytes_for_wide_part
및 min_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 컬럼에서 상당한 절감 효과를 얻을 수 있음을 알 수 있습니다.
적절한 컬럼 압축 코덱 선택하기
추가 옵션은 여기에서 확인하십시오.
아래에서는
Id, ViewCount, AnswerCount에 Delta 코덱을 지정합니다. 이 값들이 순서 지정 키와 선형적인 상관관계가 있어 Delta 인코딩의 이점을 얻을 것이라고 가정합니다.
ClickHouse Cloud의 압축
ZSTD 압축 알고리즘(기본값: 1)을 사용합니다. 이 알고리즘의 압축 속도는 압축 수준에 따라 달라질 수 있으며(수준이 높을수록 느려짐), 압축 해제는 일관되게 빠르다는 장점이 있습니다(변동 폭은 약 20%). 또한 병렬화가 가능하다는 이점도 있습니다. 과거 테스트 결과를 보면, 이 알고리즘은 대체로 충분히 효과적이며 코덱과 함께 사용하는 LZ4보다 더 나은 성능을 보이기도 합니다. 대부분의 데이터 타입과 데이터 분포에서 효과적이므로 범용 기본값으로 적절하며, 따라서 별도의 최적화가 없어도 초기 압축 설정만으로도 이미 뛰어난 성능을 제공합니다.