テーブルパーティショニング
PostgreSQL のテーブルパーティショニングとは?
パーティショニングは、1 つの論理テーブルを範囲、リスト、ハッシュによって小さな物理テーブルに分割するため、クエリやメンテナンスは必要なパーティションだけを対象にできます。
宣言的パーティショニングでは、PARTITION BY でパーティションテーブルを作成し、キーの範囲、値のリスト、またはハッシュバケットをそれぞれ保持するパーティションを追加します。アプリケーションは親テーブルに対して読み書きを行い、PostgreSQL が各行を適切なパーティションに振り分けます。
パーティションプルーニングにより、オプティマイザはクエリの WHERE 句に一致しえないパーティションをスキップできます。パーティショニングを使うと古いデータの除去も低コストになり、パーティションを DROP または DETACH するほうが、その行を 1 行ずつ削除するよりもはるかに高速です。通常、効果が現れるのは、パーティショニングしなければ非常に大きくなるテーブルの場合だけです。
例
この例では、月ごとの範囲パーティションを作成し、11 月の行について EXPLAIN で確認します。プルーニングによって 10 月のパーティションがスキップされたため、出力には measurements_2026_11 だけが表示されます。
CREATE TABLE measurements (
taken_on date NOT NULL,
value numeric
) PARTITION BY RANGE (taken_on);
CREATE TABLE measurements_2026_10 PARTITION OF measurements
FOR VALUES FROM ('2026-10-01') TO ('2026-11-01');
CREATE TABLE measurements_2026_11 PARTITION OF measurements
FOR VALUES FROM ('2026-11-01') TO ('2026-12-01');
INSERT INTO measurements VALUES ('2026-10-15', 1.5), ('2026-11-02', 2.5);
EXPLAIN SELECT * FROM measurements WHERE taken_on >= '2026-11-01';拡張機能なしの標準の PostgreSQL 16 または 17 で動くプレーンな SQL です。破棄してかまわない空のデータベースで実行してください。
出典
PostgreSQL 公式ドキュメント(英語)。