LabHub
学习 学习路径 课程

ClickHouse — 열 지향 분석 DB 를 속까지 · 열로 저장한다는 것 · 实验

200만 행을 넣고 열 파일을 들여다본다

在 LabHub 中继续学习

목표

MergeTree 표에 200만 행을 넣고, 파트·그래뉼·열별 압축률을 system 표에서 읽는다. 같은 행 수를 읽어도 건드린 열과 정렬 키에 따라 비용이 달라지는 것을 rows_read·bytes_read 로 확인한다.

왜 중요한가

열 지향 DB 에서 쿼리 비용은 "몇 행을 골랐나" 가 아니라 "어느 열을 몇 그래뉼 읽었나" 로 정해진다. 이 감각이 없으면 정렬 키를 잘못 고르고, SELECT * 를 습관처럼 쓰고, 디스크 용량을 원본 크기로 잡는다. 이 실습의 채점기는 여러분이 적은 숫자를 믿지 않는다 — 서버의 system.parts·system.columns·system.query_log 를 직접 읽고, 여러분이 저장한 SELECT 를 읽기 전용으로 다시 돌려 읽은 행·바이트를 재서 대조한다. 채점기 자신의 쿼리는 query_log 에 남지 않는다.

단계

1. 데이터베이스 col 과 표 col.events 를 만드세요 — 열 ts DateTime, site LowCardinality(String), user_id UInt64, url String, dur_ms UInt32, country FixedString(2) (이 순서), 엔진 MergeTree, 정렬 키 ORDER BY (site, ts).
2. /opt/lab/fixtures/columnar/events.sql한 번 실행해 200만 행을 넣으세요.
3. OPTIMIZE TABLE col.events FINAL 로 파트를 하나로 합친 뒤, 그 파트의 part(이름)·rows·marks·part_type/root/ch/columnar/parts.json 에 적으세요.
4. system.columns 에서 비압축/압축 비율이 가장 큰 열(most_compressed)·가장 작은 열(least_compressed)·압축 후 바이트 합(total_compressed_bytes)을 /root/ch/columnar/columns.json 에 적으세요.
5. dur_ms 의 합만 구하는 /root/ch/columnar/q_one.sqlurl 문자열의 내용을 읽는 /root/ch/columnar/q_url.sql(예: max(url))을 만들고, 두 쿼리의 bytes_read/root/ch/columnar/bytes.jsonone_col_bytes·url_bytes 로 적으세요.
6. site = 'docs.example' 인 행의 dur_ms 합을 내는 /root/ch/columnar/q_key.sqlcountry = 'KR' 인 행의 dur_ms 합을 내는 /root/ch/columnar/q_nokey.sql 을 만들고, 두 쿼리의 rows_read/root/ch/columnar/rows.jsonkey_rows_read·nokey_rows_read 로 적으세요.
7. SELECT uniqExact(user_id) FROM col.events WHERE site = 'shop.example'SETTINGS log_comment = 'chs-col-07' 을 붙여 돌린 뒤, system.query_log 에서 그 쿼리를 찾아 query_id·read_rows·read_bytes·result_rows/root/ch/columnar/qlog.json 에 적으세요.
8. col.events 와 같은 열의 표 col.small 을 만들어 col.events 의 1000행을 INSERT 한 번으로 넣고, 두 표의 파트 형식을 /root/ch/columnar/part_types.jsonevents·small 로 적으세요.

참고

8个步骤

  1. 정렬 키가 있는 MergeTree 표를 만든다
  2. 원본 200만 행을 넣는다
  3. 파트를 하나로 합치고 이름을 읽는다
  4. 열마다 압축률이 얼마나 다른가
  5. 같은 행, 다른 열 — 읽은 바이트
  6. 정렬 키로 거를 때만 건너뛴다
  7. query_log 에서 자기 쿼리를 찾는다
  8. 작은 파트는 Compact 가 된다