はじめに
PostgreSQLで実行したクエリが遅い場合に、まず実施してみる対応をまとめます。
利用場面
- SQLの実行が遅い
- データベースの作成・参照処理が遅い
環境
-
PostgreSQL: 15.8
※ この先コマンドが変わったりする可能性もあるため、バージョンも記載します。
作業内容
1. バキューム
DB全体のバキューム
VACUUM FULL VERBOSE;
※ VERBOSE
を付けることで進捗状況を確認可能。省略可。
テーブル単位のバキューム
VACUUM table テーブル名;
説明
- 不要タプルの領域回収 → テーブルの最適化
- デッドタプルの影響防止 → パフォーマンス改善
-
注意:
FULL
を実行するとディスク使用量の約2倍の空き容量が必要
2. インデックス再構築
DB全体でインデックス再構築
REINDEX INDEX インデックス名 VERBOSE;
※ VERBOSE
を付けることで進捗状況を確認可能。省略可。
テーブル単位でインデックス再構築
REINDEX TABLE テーブル名;
説明
- インデックスの断片化解消 → 検索パフォーマンス向上
-
REINDEX
により最適な状態に再構築がされる
3. 統計情報更新
DB全体の統計情報更新
ANALYZE VERBOSE;
※ VERBOSE
を付けることで進捗状況を確認可能。省略可。
テーブル単位の統計情報更新
ANALYZE テーブル名;
説明
- 統計情報更新 → オプティマイザが正確な統計情報を基に実行計画 を作成できるようになる
- データの追加、更新、削除が多いテーブル は定期的な
ANALYZE
を実施
4. 実行計画の確認
ココまでで改善できない場合は、クエリの 実行計画 を確認し、ボトルネックを特定しクエリの最適化を計る
実行計画の取得
EXPLAIN ANALYZE VERBOSE "SQL文";
※ VERBOSE
を付けることで更に詳細な情報を出力することが可能。省略可。
説明
-
EXPLAIN ANALYZE
を使うと 実際の実行時間 を取得できる -
Index Scan
やSequential Scan
などインデックスを活用できているか、また、結合方式
などを分析することが出来る - 遅い部分を把握したうえで、
インデックスの追加
やクエリの最適化
を検討を行う
5. まとめ
PostgreSQLは、バージョンが変更されると オプティマイザーの動作 が大きく変わることがあります。 そのため、これまで遅延なく動作していたクエリが バージョンアップ後に遅延 するケースが発生することがあります。
このような場合は、以下の順序で対応すると効果があることあるため、まずはやってみても良いかもしれないです。
バキューム (VACUUM FULL
)
インデックス再構築 (REINDEX
)
統計情報更新 (ANALYZE
)
実行計画確認 (EXPLAIN ANALYZE
)
もし、SQL文がわからない場合でも、実行計画(EXPLAIN ANALYZE) の結果を有識者へ展開することで何かのヒントを得ることはでき、今後のアクションなども見えてくるかと思います。