Partitioning은 큰 테이블을 컬럼 값에 따라 더 작은 물리적 조각(partition)으로 분할하되, 하나의 논리적 테이블로 유지합니다. PostgreSQL의 선언적 partitioning(Postgres 10+)이 이를 깔끔하게 만듭니다. 매우 큰 테이블의 성능과 관리성을 개선합니다.
선언적 partitioning (현대적 방식)
-- 날짜에 RANGE로 partition된 partition 테이블 생성
CREATE TABLE orders (id INT, order_date DATE, amount NUMERIC)
PARTITION BY RANGE (order_date);
-- 각 범위에 대한 partition 생성
CREATE TABLE orders_2023 PARTITION OF orders
FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');
CREATE TABLE orders_2024 PARTITION OF orders
FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
orders는 하나의 논리적 테이블이며, 연도별 partition에 물리적으로 저장됩니다. 삽입과 쿼리는 자동으로 올바른 partition으로 라우팅됩니다.
Partition pruning — 핵심 성능 이점
-- partition 키로 필터링된 쿼리는 관련 partition만 스캔
SELECT * FROM orders WHERE order_date >= '2024-06-01';
-- → Postgres가 orders_2023을 완전히 건너뜀 ("partition pruning") — orders_2024만 스캔
Partition pruning이 주요 이점입니다: partition 키로 필터링하는 쿼리는 관련 partition만 접근하여, 거대한 테이블에서 스캔되는 데이터를 극적으로 줄입니다.
Partition 전략
PARTITION BY RANGE → 값 범위 (날짜, 숫자) — 시계열에 흔함
PARTITION BY LIST → 개별 값 (지역, 상태)
PARTITION BY HASH → 키의 해시 (N개 partition에 균등 분배)
유지보수 이점
-- 전체 partition을 삭제하여 오래된 데이터를 즉시 삭제 (느린 DELETE 대비)
DROP TABLE orders_2020; -- 모든 2020 데이터 즉시 제거
-- vs DELETE FROM orders WHERE year = 2020 → 느림, bloat 생성
-- partition 분리/연결; pg_partman 확장으로 자동화
오래된 데이터를 아카이브/제거하기 위해 전체 partition을 삭제하는 것은 즉각적입니다 — 큰 데이터셋에서 DELETE 대비 주요 운영 이점입니다.
왜 중요한가
테이블 partitioning은 매우 큰 테이블을 관리하고 쿼리하는 중요한 PostgreSQL 기법이며, 이를 이해하는 것은 규모 있는 Postgres 작업에 가치가 있습니다.
테이블이 수억 또는 수십억 행으로 성장하면서, partitioning은 테이블을 더 작은 물리적 조각으로 분할하여 성능과 관리성을 다룹니다.
Postgres의 선언적 partitioning(Postgres 10+)이 이를 깔끔하게 만들고 알아야 할 현대 표준입니다.
핵심 성능 이점은 partition pruning입니다 — partition 키로 필터링하는 쿼리가 관련 partition만 스캔(나머지 건너뜀)하여, 거대한 테이블에서 스캔되는 데이터를 극적으로 줄입니다(특히 날짜로 필터링되는 시계열 데이터에 가치 있음, 매우 흔한 경우).
성능을 넘어, partitioning은 주요 유지보수 이점을 제공합니다: 전체 partition을 삭제하여 오래된 데이터를 아카이브하거나 삭제하는 것이 즉각적이 됩니다(수백만 행의 느리고 bloat를 생성하는 DELETE 대비 — 로그와 이벤트 같은 보존 정책이 있는 데이터에 상당한 운영 이점).
전략(날짜/숫자 범위에 RANGE — 시계열에 흔함, 개별 값에 LIST, 균등 분배에 HASH)과 partitioning을 언제 사용할지(자연스러운 partition 키가 있는 매우 큰 테이블, 특히 정기적 아카이빙이 있는 시계열 — 인덱싱으로 충분한 작은 테이블이 아님)를 이해하면 건전한 판단을 반영합니다.
매우 큰 테이블 관리는 규모 있는 PostgreSQL 시스템의 실제 과제이고, 선언적 partitioning(partition pruning과 효율적 partition 삭제 유지보수 포함)이 인덱싱을 보완하는 표준 도구이므로, PostgreSQL 테이블 partitioning을 이해하는 것은 데이터베이스 확장성에 가치 있고 실용적으로 관련된 지식이며, 특히 대규모, 고용량, 또는 시계열 애플리케이션에 중요하고 규모 있는 Postgres 관리 능력을 보여주는 흔한 주제입니다.
