한양과학기술고등학교

에듀테크 프로젝트 대시보드

파티셔닝

PARTITION BY RANGE LIST HASH pruning

한 논리 테이블을 물리적으로 여러 조각으로 나눕니다. 아주 큰 테이블의 관리·조회·삭제를 빠르게 합니다.

1. 선언적 파티셔닝 (PG10+)

CREATE TABLE events (
    id bigint GENERATED ALWAYS AS IDENTITY,
    created_at timestamptz NOT NULL,
    payload jsonb
) PARTITION BY RANGE (created_at);

CREATE TABLE events_2026_09 PARTITION OF events
    FOR VALUES FROM ('2026-09-01') TO ('2026-10-01');
CREATE TABLE events_2026_10 PARTITION OF events
    FOR VALUES FROM ('2026-10-01') TO ('2026-11-01');

2. 종류

방식쓰는 곳
RANGE시간·번호 구간 (로그, 주문) — 가장 흔함
LIST지역·카테고리 등 이산 값
HASH고른 분산이 목적일 때 (자연스러운 키가 없음)

3. 이점

무엇이 빨라지나
  • 파티션 프루닝 — WHERE created_at >= '2026-10-01' 이면 9월 파티션은 아예 안 봄
  • 오래된 데이터 삭제가 DROP TABLE events_2025_01 — DELETE 없이 즉시, VACUUM 불필요
  • ATTACH/DETACH 로 벌크 적재·아카이브

4. 주의

함정
  • 미래 파티션을 미리 만들어 둬야 함 (없으면 INSERT 실패) → pg_partman 또는 cron
  • 파티션 키는 모든 UNIQUE/PK 에 포함돼야 함
  • 파티션이 수백 개 넘어가면 계획 수립 자체가 느려짐
  • 테이블이 크지 않으면(수천만 행 미만) 인덱스로 충분 — 섣부른 파티셔닝 금물
"커넥션은 비싸다 — 요청마다 열지 말고 풀에서 빌려라"