DBAtlas · 데이터베이스 운영 아틀라스

파티션 생성 / 분할 / 삭제

Oracle

-- Add a RANGE partition
ALTER TABLE sales ADD PARTITION p2026 VALUES LESS THAN (TO_DATE('2027-01-01','YYYY-MM-DD'));

-- Split an existing partition
ALTER TABLE sales SPLIT PARTITION pmax AT (TO_DATE('2027-01-01','YYYY-MM-DD')) INTO (PARTITION p2026, PARTITION pmax);

-- Drop a partition
ALTER TABLE sales DROP PARTITION p2020 UPDATE INDEXES;

RANGE/LIST/HASH 파티셔닝을 지원한다. DROP PARTITION은 해당 파티션의 모든 행을 삭제하며, UPDATE INDEXES를 지정하면 글로벌 인덱스가 유효하게 유지된다. Interval 파티셔닝은 파티션을 자동으로 추가할 수 있다.

PostgreSQL

-- Declarative partitioning: parent table
CREATE TABLE sales (id bigint, created_at date, amount numeric) PARTITION BY RANGE (created_at);

-- Add a new partition
CREATE TABLE sales_2026 PARTITION OF sales FOR VALUES FROM ('2026-01-01') TO ('2027-01-01');

-- Attach a standalone (existing) table as a partition
CREATE TABLE sales_2027 (LIKE sales INCLUDING ALL);
ALTER TABLE sales ATTACH PARTITION sales_2027 FOR VALUES FROM ('2027-01-01') TO ('2028-01-01');

-- Detach a partition (the table is not dropped; it remains a standalone table)
ALTER TABLE sales DETACH PARTITION sales_2026;

기본 PostgreSQL에는 SPLIT/MERGE PARTITION이 없다(PG17 기준). 분할하려면 파티션을 DETACH하고, 새 경계로 파티션 두 개를 만든 뒤 데이터를 옮기고 ATTACH한다. DETACH ... CONCURRENTLY(PG14+)는 락 유지 시간을 줄인다.

MySQL

-- Partitioned table
CREATE TABLE sales (id BIGINT, created_at DATE) PARTITION BY RANGE (YEAR(created_at)) (
  PARTITION p2024 VALUES LESS THAN (2025),
  PARTITION p2025 VALUES LESS THAN (2026),
  PARTITION pmax VALUES LESS THAN MAXVALUE
);

-- Add / split / drop a partition
ALTER TABLE sales REORGANIZE PARTITION pmax INTO (
  PARTITION p2026 VALUES LESS THAN (2027),
  PARTITION pmax VALUES LESS THAN MAXVALUE
);
ALTER TABLE sales DROP PARTITION p2024;

파티셔닝 컬럼은 모든 PRIMARY KEY / UNIQUE 키에 포함되어야 한다. RANGE의 분할/병합은 REORGANIZE PARTITION으로 수행한다. DROP PARTITION은 행도 함께 삭제한다(RANGE/LIST).

SQL Server

-- 1) Partition function and scheme
CREATE PARTITION FUNCTION pf_date (date) AS RANGE RIGHT FOR VALUES ('2025-01-01','2026-01-01');
CREATE PARTITION SCHEME ps_date AS PARTITION pf_date ALL TO ([PRIMARY]);

-- 2) Add a new boundary (split)
ALTER PARTITION SCHEME ps_date NEXT USED [PRIMARY];
ALTER PARTITION FUNCTION pf_date() SPLIT RANGE ('2027-01-01');

-- 3) Remove a boundary (merge)
ALTER PARTITION FUNCTION pf_date() MERGE RANGE ('2025-01-01');

partition function + scheme을 정의하고, CREATE TABLE ... ON ps_date(created_at)로 해당 scheme 위에 테이블을 생성한다. SPLIT 전에 NEXT USED 파일 그룹을 지정해야 한다. 데이터를 제거하려면 SWITCH PARTITION으로 스테이징 테이블로 전환한다.

MongoDB

// MongoDB uses sharding instead of table partitioning
sh.shardCollection("db.sales", { created_at: 1 });

// Native time-series collection for time series
db.createCollection("measurements", { timeseries: { timeField: "ts", granularity: "hours" } });

고전적 의미의 파티셔닝은 없다. 수평 분할은 샤딩을 통해 chunk 단위로 이루어진다. 시간 기반 데이터는 time-series 컬렉션이 자동 버킷팅을 제공한다.

Redis

# Not applicable: Redis has no table/partition concept; scaling is done with Redis Cluster hash slots (16384).

Redis Cluster는 키를 16384개의 해시 슬롯에 분산한다. 이는 테이블 파티셔닝이 아니라 애플리케이션 수준의 분할이며, 수동 파티션 명령은 없다.

Elasticsearch

# Time-based automatic splitting (rollover) with an ILM policy + data stream
PUT _ilm/policy/logs-policy
{ "policy": { "phases": { "hot": { "actions": { "rollover": { "max_size": "50gb", "max_age": "30d" } } } } } }

PUT _index_template/logs-tmpl
{ "index_patterns": ["logs*"], "data_stream": {}, "template": { "settings": { "index.lifecycle.name": "logs-policy" } } }

Elasticsearch에서는 인덱스를 샤드로 나누고, 시계열은 ILM + data stream으로 새 backing index를 생성(rollover)하여 분할한다. 오래된 인덱스는 ILM으로 삭제할 수 있다.

DBAtlas에서 열기 →