PostgreSQL パーティショニングガイド
このドキュメントでは、PostgreSQLのテーブルパーティショ ニングの設計と運用を解説します。
目次
1. パーティショニングの概要
1.1 パーティショニングとは
┌──────────────────────────────────────────────────────────────┐
│ パーティショニングとは │
├──────────────────────────────────────────────────────────────┤
│ │
│ 大きなテーブルを複数の小さな部分(パーティション)に │
│ 分割する技術 │
│ │
│ 【非パーティションテーブル】 │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ orders (10億行) │ │
│ │ 全データが1つのテーブルに格納 │ │
│ └────────────────────────────────────────────────────────┘ │
│ ↓ │
│ 【パーティションテーブル】 │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ orders (親テーブル) │ │
│ └───────────────────────────────────────────────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ orders_2023 │ │ orders_2024 │ │ orders_2025 │ ... │
│ │ (3億行) │ │ (4億行) │ │ (3億行) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ アプリケーションからは1つのテーブルに見える │
│ 内部的には複数のパーティションに分散 │
│ │
└──────────────────────────────────────────────────────────────┘
1.2 パーティショニングのメリット
┌──────────────────────────────────────────────────────────────┐
│ パーティショニングのメリット │
├──────────────────────────────────────────────────────────────┤
│ │
│ 【パフォーマンス向上】 │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ パーティションプルーニング │ │
│ │ - クエリ条件に該当しないパーティションをスキップ │ │
│ │ - 例: WHERE created_at >= '2024-01-01' │ │
│ │ → 2023年以前のパーティションは読まない │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ 【メンテナンス効率化】 │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ - VACUUM/ANALYZEがパーティション単位で実行可能 │ │
│ │ - 古いデータのDROPが高速 (DELETE不要) │ │
│ │ - インデックス再構築がパーティション単位 │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ 【データ管理】 │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ - 古いデータのアーカイブが容易 │ │
│ │ - パーティション単位でテーブルスペースを分離可能 │ │
│ │ - データ保持ポリシーの実装が容易 │ │
│ └─────────────── ───────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────┘
1.3 パーティショニングが有効なケース
┌──────────────────────────────────────────────────────────────┐
│ パーティショニングが有効なケース │
├──────────────────────────────────────────────────────────────┤
│ │
│ 【推奨】 │
│ ✅ テーブルサイズが数十GB以上 │
│ ✅ 時系列データ (ログ、イベント、トランザクション) │
│ ✅ 定期的に古いデータを削除/アーカイブする │
│ ✅ 特定の条件でのクエリが大部分 │
│ ✅ テナント別のデータ分離 │
│ │
│ 【非推奨】 │
│ ❌ テーブルサイズが小さい (数GB以下) │
│ ❌ パーティションキーでのフィルタがほとんどない │
│ ❌ 全パーティションを常にスキャンするクエリが多い │
│ ❌ トランザクションが複数パーティションにまたがる │
│ │
│ 【目安】 │
│ - 数千万行以上で検討開始 │
│ - 1億行以上で強く推奨 │
│ │
└──────────────────────────────────────────────────────────────┘