테이블 파티셔닝 (Table Partitioning)¶
테이블이 거대해지면 인덱스·쿼리가 느려집니다. PostgreSQL 의 파티셔닝(Partitioning)은 하나의 논리 테이블을 여러 물리 조각(파티션)으로 나눠, 쿼리·관리 대상을 좁히는 기법입니다. 이번 장은 선언적 파티셔닝의 종류와 데이터스케쳐스 실무 적용을 정리합니다.
파티셔닝이 필요한 순간¶
- 단일 테이블이 수천만~수억 행에 이르러 인덱스 크기와 VACUUM 부담이 커질 때.
- 오래된 데이터(이벤트 로그)를 주기적으로 버려야 할 때 — 파티션 드롭만으로 빠르게 삭제.
- 시계열 조회가 특정 기간에 집중될 때.
파티셔닝 종류¶
선언적 파티셔닝(PARTITION BY)은 파티션 키 방식을 지정합니다.
| 방식 | 분할 기준 | 사용 예 |
|---|---|---|
RANGE |
값 범위 | 시간(일/월)별, 가격 구간 |
LIST |
명시적 값 | 지역, 상태 코드, 테넌트 |
HASH |
해시 버킷 | 균등 분산(쓰기 고르게) |
CREATE TABLE events (
id bigint, tenant text, created_at timestamptz, payload jsonb
) PARTITION BY RANGE (created_at);
CREATE TABLE events_2026_01 PARTITION OF events
FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');
파티션 프루닝¶
쿼리의 WHERE 가 파티션 키를 포함하면 옵티마이저가 해당 파티션만 검사합니다
(partition pruning). 파티션 키를 쓰지 않는 쿼리는 전체 스캔하므로, 자주 쓰는
쿼리 패턴에 맞춰 파티션 키를 잡아야 합니다.
데이터스케쳐스 실무 관점¶
- 행사·이벤트 로그:
created_atRANGE 월별 파티션으로 쌓고, 오래된 달은DETACH/DROP로 한 번에 정리 — 삭제 시DELETE대신 파티션 드롭이 훨씬 빠름. - 테넌트 격리: SaaS 다중 테넌트는
LIST (tenant)로 테넌트별 파티션 분리 가능 (단 파티션 수 제한과 균형 고려). - 파티션 관리 자동화는
pg_partman확장으로 스케줄 생성/제거 가능. - 주의: 기본 키는 파티션 키를 포함해야 하고, 파티션별 개별 테이블이므로 외래 키 정의 등에 제약이 있습니다.
확인 필요¶
- 파티션 수·인덱스·외래 키 제약 세부는 PostgreSQL 버전에 따라 다르므로, 사용 버전 공식 문서를 재확인하세요. (확인 필요)
더 알아보기¶
- 1차(공식): PostgreSQL — Table Partitioning
- 1차(공식): PostgreSQL — Partition Pruning