ClickHouse — A Columnar Analytics Database from the Inside
Quiz: Types and Codecs
한국어 원문으로 표시합니다.
10초 간격으로 늘어나는 시각 열이 기본 코덱(LZ4)으로는 거의 줄지 않았는데 CODEC(Delta, ZSTD(1)) 로는 수백 분의 일이 되었다. 가장 알맞은 설명은?
- Delta 가 값을 이웃과의 차이(10, 10, …)로 바꿔 범용 코덱이 찾을 반복을 만들어 주었다
- ZSTD 는 시각 타입을 알아보고 날짜 부분을 따로 떼어 저장한다
- Delta 를 붙이면 열이 정렬 키로 바뀌어 성긴 인덱스에 흡수된다
- LZ4 는 DateTime 을 압축하지 않도록 서버 설정에서 빠져 있다
CPU 사용률(Float64, 소수 둘째 자리) 열에 CODEC(Gorilla, ZSTD(1)) 을 붙였더니 CODEC(ZSTD(1)) 만 쓴 열보다 커졌다. 여기서 얻을 교훈은?
- Gorilla 는 정수 열에만 쓸 수 있으므로 부동소수에서는 늘 손해다
- 전문 코덱은 자료가 그 코덱의 전제(천천히 변하는 값의 비트 패턴)에 맞을 때만 이기므로 재서 고른다
- Gorilla 는 ZSTD 뒤에 와야 하는데 순서를 거꾸로 적었다
- 부동소수 열은 어떤 코덱을 써도 압축되지 않는다
값이 네 종류뿐인 status 열을 String 대신 LowCardinality(String) 으로 바꿨을 때 크기가 줄어드는 까닭은?
- LowCardinality 는 문자열을 자동으로 ZSTD(22) 로 압축한다
- LowCardinality 는 중복 행을 병합 때 지워 행 수를 줄인다
- 서로 다른 값을 사전에 한 번씩 적고 행마다 작은 번호만 저장해 압축 전 크기부터 줄어든다
- LowCardinality 열은 system.columns 에 크기가 잡히지 않는다
Nullable(UInt16) 열에서 SELECT count() WHERE err IS NULL 이 100만 행에 1,000,000바이트를 읽었다. 이 숫자가 뜻하는 것은?
- NULL 인 행만 골라 읽어서 행 수만큼 바이트가 나왔다
- UInt16 값 파일의 절반만 읽었다
- 결과가 캐시에 있어 행당 1바이트로 어림한 값이다
- 행마다 1바이트인 null 지도만 읽고 값 파일은 열지 않았다
운영 중인 표에 ALTER TABLE t MODIFY COLUMN ts CODEC(Delta, ZSTD(1)) 을 실행한 직후 system.columns 의 ts 크기가 전혀 변하지 않았다. 왜인가?
- ALTER 가 실패했는데 오류 메시지가 숨겨졌다
- 코덱 변경은 메타데이터만 바꾸고, 이미 쓰인 파트는 병합 등으로 다시 쓰일 때 새 코덱이 적용된다
- system.columns 는 하루에 한 번만 갱신된다
- Delta 코덱은 ALTER 로는 붙일 수 없고 CREATE 에서만 된다
CREATE TABLE ... (x Float64 CODEC(Delta)) 가 "does not compress anything" 오류로 거절되었다. 서버가 막은 이유는?
- Delta 는 전처리일 뿐이라 뒤에 범용 코덱이 없으면 크기가 줄지 않기 때문이다
- Float64 에는 어떤 코덱도 붙일 수 없기 때문이다
- Delta 는 정렬 키 열에만 붙일 수 있기 때문이다
- Delta 는 실험 기능이라 설정을 켜야 하기 때문이다