Skip to content

테이블 파티셔닝 (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_at RANGE 월별 파티션으로 쌓고, 오래된 달은 DETACH/DROP 로 한 번에 정리 — 삭제 시 DELETE 대신 파티션 드롭이 훨씬 빠름.
  • 테넌트 격리: SaaS 다중 테넌트는 LIST (tenant) 로 테넌트별 파티션 분리 가능 (단 파티션 수 제한과 균형 고려).
  • 파티션 관리 자동화는 pg_partman 확장으로 스케줄 생성/제거 가능.
  • 주의: 기본 키는 파티션 키를 포함해야 하고, 파티션별 개별 테이블이므로 외래 키 정의 등에 제약이 있습니다.

확인 필요

  • 파티션 수·인덱스·외래 키 제약 세부는 PostgreSQL 버전에 따라 다르므로, 사용 버전 공식 문서를 재확인하세요. (확인 필요)

더 알아보기