データベースパーティショニングガイド
1. 概要
本ドキュメントでは、idp-serverにおけるPostgreSQLパーティショニングの設計指針と実装パターンを説明します。
1.1 パーティショニングとは
パーティショニングは、1つの論理テーブルを複数の物理テーブル(パーティション)に分割する技術です。
┌─────────────────────────────────────────────────────────────────────────────┐
│ security_event (親テーブル = 論理的な窓口) │
│ │
│ 「私はただの入り 口です。実データは子テーブルが持っています」 │
│ │
└───────────────────────────────────┬─────────────────────────────────────────┘
│
┌─────────────────────────┼─────────────────────────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ _2025_12_01 │ │ _2025_12_02 │ ... │ _2025_12_90 │
│ │ │ │ │ │
│ 12/01のデータ │ │ 12/02のデータ │ │ 90日後のデータ│
│ │ │ │ │ │
│ 物理ファイルA │ │ 物理ファイルB │ │ 物理ファイルN │
└───────────────┘ └───────────────┘ └───────────────┘
各パーティション = 独立した物理ファイル
1.2 主なメリット
| 項目 | 従来方式 | パーティショニング |
|---|---|---|
| 古いデータ削除 | DELETE文(数時間〜数日) | DROP TABLE(数秒) |
| VACUUM負荷 | 高い | なし |
| 日付範囲クエリ | 全件スキャン | パーティションプルーニング |
| ストレージ管理 | 手動管理 | 自動削除で一定量維持 |
2. DELETE vs DROP TABLE
2.1 DELETE文の動作(通常テーブル)
DELETE FROM security_event WHERE created_at < '2025-09-05';
┌─────────────────────────────────────────────────────────────────────────────┐
│ security_event │
│ │
│ ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │
│ │ 行1 │ 行2 │ 行3 │ 行4 │ 行5 │ 行6 │ 行7 │ 行8 │ 行9 │行10 │ ... │
│ │ 古い│ 古い│ 新し│ 古い│ 新し│ 古い│ 新し│ 古い│ 新し│ 古い│ │
│ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ │
│ ↓ ↓ ↓ ↓ ↓ ↓ │
│ 削除 削除 削除 削除 削除 削除 │
│ マーク マーク マーク マーク マーク マーク │
│ │
│ 処理内容: │
│ 1. 全行をスキャン (WHERE条件チェック) ← 時間かかる │
│ 2. 該当行に「削除済み」マークを付ける ← 時間かかる │
│ 3. トランザクションログに記録 ← I/O負荷 │
│ 4. 後でVACUUMで実際に領域回収 ← さらに時間かかる │
│ │
│ 結果: 5億行削除 = 数時間〜数日 │
└─────────────────────────────────────────────────────────────────────────────┘
2.2 DROP TABLEの動作(パーティションテーブル)
DROP TABLE security_event_2025_09_05;
┌─────────────────────────────────────────────────────────────────────────────┐
│ │
│ パーティション = 独立した物理ファイル │
│ │
│ ┌─────────────────┐ │
│ │ _2025_09_05 │ rm /var/lib/postgresql/.../security_event_... │
│ │ │ ──────────────────────────────────────────────▶ │
│ │ 物理ファイル │ ファイル削除! │
│ │ 625GB │ │
│ └─────────────────┘ │
│ │ │
│ ▼ │
│ 🗑️ ゴミ箱へ(ファイルシステムレベルで即削除) │
│ │
│ 処理内容: │
│ 1. メタデータ(カタログ)から登録解除 ← 一瞬 │
│ 2. ファイルシステムがファイル削除 ← 一瞬 │
│ │
│ 結果: 625GB削除 = 数秒 │
└─────────────────────────────────────────────────────────────────────────────┘
2.3 処理時間比較(5億行/日の場合)
| 操作 | DELETE方式 | DROP TABLE方式 |
|---|---|---|
| 該当行特定 | 30分 | - |
| 削除マーク付与 | 2時間 | - |
| トランザクションログ | 1時間 | - |
| VACUUM | 3時間 | - |
| メタデータ更新 | - | 0.1秒 |
| ファイル削除 | - | 0.5秒 |
| 合計 | 約6〜7時間 | 約1秒 |
3. パーティションプルーニング
クエリ実行時に、条件に合致するパーティションのみをスキャンする最適化機能です。