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 を付けるとグローバルインデックスは有効なまま保たれる。インターバルパーティショニングではパーティションを自動追加できる。

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 し、新しい境界で 2 つのパーティションを作成してデータを移動し、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');

パーティション関数とパーティション構成を定義し、CREATE TABLE ... ON ps_date(created_at) でその構成上にテーブルを作成する。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" } });

従来の意味でのパーティショニングはない。水平分割はシャーディングによりチャンク単位で行う。時系列データでは 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 + データストリーム(rollover)で新しいバッキングインデックスを作成することで分割を実現する。古いインデックスは ILM で削除できる。

DBAtlas で開く →