LabHub
배우기 러닝패스 코스

ClickHouse — 열 지향 분석 DB 를 속까지 · 타입과 코덱 · 퀴즈

퀴즈: 타입과 코덱

LabHub 에서 이어서 보기

6문항. 정답과 해설은 풀어 본 뒤에 보여 드립니다.

  1. 10초 간격으로 늘어나는 시각 열이 기본 코덱(LZ4)으로는 거의 줄지 않았는데 `CODEC(Delta, ZSTD(1))` 로는 수백 분의 일이 되었다. 가장 알맞은 설명은?

    1. Delta 가 값을 이웃과의 차이(10, 10, …)로 바꿔 범용 코덱이 찾을 반복을 만들어 주었다
    2. ZSTD 는 시각 타입을 알아보고 날짜 부분을 따로 떼어 저장한다
    3. Delta 를 붙이면 열이 정렬 키로 바뀌어 성긴 인덱스에 흡수된다
    4. LZ4 는 DateTime 을 압축하지 않도록 서버 설정에서 빠져 있다
  2. CPU 사용률(Float64, 소수 둘째 자리) 열에 `CODEC(Gorilla, ZSTD(1))` 을 붙였더니 `CODEC(ZSTD(1))` 만 쓴 열보다 커졌다. 여기서 얻을 교훈은?

    1. Gorilla 는 정수 열에만 쓸 수 있으므로 부동소수에서는 늘 손해다
    2. 전문 코덱은 자료가 그 코덱의 전제(천천히 변하는 값의 비트 패턴)에 맞을 때만 이기므로 재서 고른다
    3. Gorilla 는 ZSTD 뒤에 와야 하는데 순서를 거꾸로 적었다
    4. 부동소수 열은 어떤 코덱을 써도 압축되지 않는다
  3. 값이 네 종류뿐인 status 열을 `String` 대신 `LowCardinality(String)` 으로 바꿨을 때 크기가 줄어드는 까닭은?

    1. LowCardinality 는 문자열을 자동으로 ZSTD(22) 로 압축한다
    2. LowCardinality 는 중복 행을 병합 때 지워 행 수를 줄인다
    3. 서로 다른 값을 사전에 한 번씩 적고 행마다 작은 번호만 저장해 압축 전 크기부터 줄어든다
    4. LowCardinality 열은 system.columns 에 크기가 잡히지 않는다
  4. `Nullable(UInt16)` 열에서 `SELECT count() WHERE err IS NULL` 이 100만 행에 1,000,000바이트를 읽었다. 이 숫자가 뜻하는 것은?

    1. NULL 인 행만 골라 읽어서 행 수만큼 바이트가 나왔다
    2. UInt16 값 파일의 절반만 읽었다
    3. 결과가 캐시에 있어 행당 1바이트로 어림한 값이다
    4. 행마다 1바이트인 null 지도만 읽고 값 파일은 열지 않았다
  5. 운영 중인 표에 `ALTER TABLE t MODIFY COLUMN ts CODEC(Delta, ZSTD(1))` 을 실행한 직후 system.columns 의 ts 크기가 전혀 변하지 않았다. 왜인가?

    1. ALTER 가 실패했는데 오류 메시지가 숨겨졌다
    2. 코덱 변경은 메타데이터만 바꾸고, 이미 쓰인 파트는 병합 등으로 다시 쓰일 때 새 코덱이 적용된다
    3. system.columns 는 하루에 한 번만 갱신된다
    4. Delta 코덱은 ALTER 로는 붙일 수 없고 CREATE 에서만 된다
  6. `CREATE TABLE ... (x Float64 CODEC(Delta))` 가 "does not compress anything" 오류로 거절되었다. 서버가 막은 이유는?

    1. Delta 는 전처리일 뿐이라 뒤에 범용 코덱이 없으면 크기가 줄지 않기 때문이다
    2. Float64 에는 어떤 코덱도 붙일 수 없기 때문이다
    3. Delta 는 정렬 키 열에만 붙일 수 있기 때문이다
    4. Delta 는 실험 기능이라 설정을 켜야 하기 때문이다