LabHub
学习 学习路径 课程

ClickHouse — 열 지향 분석 DB 를 속까지 · 성긴 기본 키 · 实验

정렬 키 순서를 바꿔 가며 건너뛴 그래뉼을 센다

在 LabHub 中继续学习

목표

같은 200만 행을 정렬 키가 다른 여러 표에 넣고, EXPLAIN indexes = 1 의 그래뉼 수와 rows_read 로 성긴 기본 인덱스가 무엇을 건너뛰는지 확인한다. 마지막에 주어진 쿼리에 맞는 정렬 키를 직접 고른다.

왜 중요한가

ClickHouse 표의 정렬 키는 만든 뒤에 바꾸기 어렵고, 잘못 고르면 인덱스가 있어도 매번 전부 읽는다. 어느 열을 앞에 둘지는 감이 아니라 "이 쿼리는 몇 그래뉼을 고르나" 로 정한다. 이 실습의 채점기는 여러분이 적은 숫자를 믿지 않는다 — 여러분이 저장한 SELECT 에 EXPLAIN 을 붙여 읽기 전용으로 다시 돌리고, 같은 SELECT 를 다시 실행해 읽은 행을 재서 대조한다.

단계

1. 데이터베이스 sparse 와 표 sparse.hits 를 만드세요 — 열 site LowCardinality(String), user_id UInt32, ts DateTime, dur_ms UInt32 (이 순서), 엔진 MergeTree, 정렬 키 ORDER BY (site, user_id).
2. /opt/lab/fixtures/sparse/hits.sql한 번 실행해 200만 행을 넣고 OPTIMIZE TABLE sparse.hits FINAL 로 파트를 하나로 합치세요.
3. site = 'docs.example' 인 행의 dur_ms 합을 내는 /root/ch/sparse/q_site.sql 을 만들고, 그 SELECT 에 EXPLAIN indexes = 1 을 붙인 출력을 /root/ch/sparse/explain_site.txt 에 저장한 뒤, PrimaryKey 단계의 고른/전체 그래뉼과 검색 방식을 /root/ch/sparse/granules.jsonselected·total·search 로 적으세요.
4. user_id = 4242 인 행의 dur_ms 합을 내는 /root/ch/sparse/q_user.sql 을 만들고, EXPLAIN 의 고른 그래뉼·검색 방식과 이 쿼리의 rows_read/root/ch/sparse/user.jsonselected·search·rows_read 로 적으세요.
5. 같은 열에 정렬 키만 ORDER BY (user_id, site)sparse.hits_us 를 만들어 sparse.hits 의 행을 옮기고 파트를 하나로 합치세요. 그 표에서 user_id = 4242 의 합을 내는 /root/ch/sparse/q_user_us.sql, site = 'docs.example' 의 합을 내는 /root/ch/sparse/q_site_us.sql 을 만들고 두 쿼리의 rows_read/root/ch/sparse/order.jsonuser_rows_read·site_rows_read 로 적으세요.
6. sparse.hits 와 같은 열·정렬 키에 SETTINGS index_granularity = 1024sparse.hits_g1k 를 만들어 행을 옮기고 합치세요. 그 표의 marks·primary_key_size(system.parts)와, user_id = 4242 의 합을 내는 /root/ch/sparse/q_user_g1k.sqlrows_read/root/ch/sparse/granularity.jsonmarks·primary_key_size·user_rows_read 로 적으세요.
7. 정렬 키 ORDER BY (site, user_id, ts) 에 기본 키 PRIMARY KEY (site, user_id) 를 따로 둔 sparse.hits_pk 와, 같은 정렬 키에 PRIMARY KEY 를 적지 않은 sparse.hits_full 을 만들어 행을 옮기고 합치세요. 두 표의 primary_key_size/root/ch/sparse/pk.jsonhits_pk·hits_full 로 적으세요.
8. 하루치 사이트 보고서 WHERE site = 'api.example' AND ts >= '2026-09-10 00:00:00' AND ts < '2026-09-11 00:00:00'dur_ms 합을 sparse.hits 에서 내는 /root/ch/sparse/q_day_hits.sql 과, 정렬 키를 여러분이 골라 만든 sparse.hits_day(같은 열·같은 행, 파트 하나)에서 내는 /root/ch/sparse/q_day.sql 을 만드세요. q_day.sqlrows_readq_day_hits.sql4분의 1 이하여야 합니다. 두 값을 /root/ch/sparse/day.jsonhits_rows_read·day_rows_read 로 적으세요.

참고

8个步骤

  1. 종류가 적은 열을 앞에 둔 표
  2. 200만 행을 넣고 파트를 하나로
  3. 첫 키 열로 거르면 — 이진 탐색
  4. 두 번째 키 열로만 거르면
  5. 키 순서를 뒤집은 표
  6. 그래뉼을 1024행으로 줄이면
  7. PRIMARY KEY 를 정렬 키의 앞부분으로
  8. 쿼리에 맞는 정렬 키를 고른다