LabHub
배우기 러닝패스 코스

ClickHouse — 열 지향 분석 DB 를 속까지 · 파티션 · 실습

월 파티션을 거르고, 지우고, 떼고, 옮긴다

LabHub 에서 이어서 보기

목표

월 파티션 표에서 가지치기(Min-Max)가 무엇을 버리는지 EXPLAIN 으로 읽고, 파티션 없는 표와 읽은 행을 비교한다. DROP/DETACH/ATTACH PARTITION 과 DELETE 의 차이를 system.mutations·part_log 로 확인하고, 너무 잘게 나눈 파티션이 INSERT 를 막는 것을 본다.

왜 중요한가

파티션 키는 한 번 정하면 바꾸기 어렵고, 잘못 고르면(너무 잘게) 파트가 폭증해 INSERT 가 막힌다. 반대로 잘 고르면 보관 주기 관리가 파일 단위로 끝난다. 이 실습의 채점기는 여러분이 적은 숫자를 믿지 않는다 — 저장한 SELECT 에 EXPLAIN 을 붙여 읽기 전용으로 다시 돌리고, 파티션 조작은 표의 행 해시와 system.mutations·part_log·query_log 로 대조한다.

단계

1. 데이터베이스 ptn 과 표 ptn.sales 를 만드세요 — 열 ts DateTime, region LowCardinality(String), order_id UInt64, amount UInt32 (이 순서), 엔진 MergeTree, PARTITION BY toYYYYMM(ts), ORDER BY (region, ts).
2. /opt/lab/fixtures/partition/sales.sql한 번 실행해 150만 행을 넣고 OPTIMIZE TABLE ptn.sales FINAL 로 합친 뒤, 파티션마다 partition_id·part(파트 이름)·rows 를 담은 JSON 배열을 /root/ch/partition/partitions.json 에 저장하세요.
3. 2026년 8월(ts >= '2026-08-01 00:00:00' AND ts < '2026-09-01 00:00:00')의 amount 합을 내는 /root/ch/partition/q_aug.sql 을 만들고, EXPLAIN indexes = 1 출력을 /root/ch/partition/explain_aug.txt 에 저장한 뒤, Min-Max 단계의 남은/전체 파트와 이 쿼리의 rows_read/root/ch/partition/prune.jsonparts_selected·parts_total·rows_read 로 적으세요.
4. 파티션 없이 같은 열·ORDER BY (region, ts)ptn.sales_flat 을 만들어 ptn.sales 의 행을 옮기고 합치세요. 같은 8월 조건으로 그 표를 읽는 /root/ch/partition/q_flat.sql 을 만들고, 두 쿼리의 rows_read/root/ch/partition/compare.jsonpartitioned_rows_read·flat_rows_read 로 적으세요.
5. ptn.sales 의 사본 ptn.s_drop·ptn.s_delete 를 만들어(CREATE TABLE ... AS ptn.sales + 행 복사 + 합치기) 7월을 지우세요 — s_dropDROP PARTITION 202607, s_deleteALTER TABLE ... DELETE WHERE toYYYYMM(ts) = 202607 SETTINGS mutations_sync = 1. 두 표의 system.mutations 행 수와 s_delete 의 part_log MutatePart 사건 수를 /root/ch/partition/dropdel.jsondrop_mutations·delete_mutations·delete_mutated_parts 로 적으세요.
6. 사본 ptn.s_detach 를 같은 방법으로 만들어 DETACH PARTITION 202609 로 떼어 낸 뒤 system.detached_parts 에 보이는 파트 이름을 확인하고, ATTACH PARTITION 202609 로 다시 붙이세요. 뗄 때의 이름과 다시 붙은 뒤의 활성 파트 이름을 /root/ch/partition/detach.jsondetached_part·attached_part 로 적으세요.
7. CREATE TABLE ptn.sales_jul AS ptn.sales 로 빈 표를 만들고, INSERT 없이 ALTER TABLE ptn.sales_jul ATTACH PARTITION 202607 FROM ptn.sales 로 7월을 복사해 오세요.
8. 같은 열에 PARTITION BY (toDate(ts), region)·ORDER BY tsptn.sales_fine 을 만들어 ptn.sales 전체를 INSERT 해 보고, 나온 오류를 /root/ch/partition/toofine.txt 에 저장하세요. ptn.sales 에서 (날짜, 지역) 조합이 몇 개인지 세어 /root/ch/partition/fine.jsonpartitions_needed 로 적으세요.

참고

8단계

  1. 월 파티션 표를 만든다
  2. 석 달치를 넣고 파티션별 파트를 적는다
  3. 8월만 거르면 — Min-Max 가지치기
  4. 파티션을 빼면 얼마나 더 읽나
  5. 같은 7월을 두 방법으로 지운다
  6. 떼었다 다시 붙이면 이름이 바뀐다
  7. INSERT 없이 한 달을 복사해 온다
  8. 너무 잘게 나눈 파티션