2026年11月1日
2026年11月1日
PostgreSQLのEXPLAIN ANALYZEでクエリ計画を分析する方法
はじめに
PostgreSQLは、データベース管理システムとして広く使用されています。しかし、SQLクエリが効率的かどうかを判断するためには、内部でどのように実行されるかを理解することが重要です。EXPLAIN ANALYZEは、そのようなクエリの実行計画(クエリ計画)を見える化し、最適化に役立つツールです。
症状・背景
このテーマが必要になる主な場面:
- 高負荷時のパフォーマンス低下
- SQLの優先度を上げる必要がある
- クエリの実行時間が予想以上に長い
- テーブルやインデックスが正しく作成されていない
手順・設定方法
ステップ1: EXPLAINを実行して基本的な計画を得る
# SQLクエリをEXPLAINで解析します。この例では、usersテーブルの全件取得を行います。
\timing on # 実行時間も表示する
EXPLAIN SELECT * FROM users;
ステップ2: ANALYZEを追加して実際のパフォーマンス計画を得る
# EXPLAINとANALYZEを組み合わせることで、実際のI/O数や実行時間も確認できます。
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 30;
ステップ3: 組み合わせ使用例
# ショートカットとして、EXPLAIN (ANALYZE, BUFFERS) を使うことも可能です。これでI/O数やメモリ消費量も確認できます。
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM users WHERE age > 30;
ステップ4: 実践とトラブルシュート
# EXPLAIN ANALYZEの結果から、パフォーマンスが低下している箇所を特定します。
EXPLAIN ANALYZE SELECT COUNT(*) FROM orders WHERE order_date BETWEEN '2021-01-01' AND '2021-12-31';
# 結果によると、ORDER BY clauseで全件探索が必要とされている可能性があります。インデックス化を検討します。
注意事項
- EXPLAIN ANALYZEはデバッグツールとして有用ですが、大量のデータでは実行時間が長くなる場合があります。
- 予め必要な権限があることを確認してください(特にANALYZEオプションを使用する際)。
- 定期的な監視と最適化が必要です。
まとめ
1. EXPLAIN: SQLクエリの実行計画を表示します。
2. ANALYZE: EXPLAINに実行時間を追加し、パフォーマンス情報を得ます。
3. BUFFERS: I/O数やメモリ消費量も考慮に入れるためのオプションです。
4. 定期的な最適化: インデックスの再構築やクエリの最適化が必要です。
関連記事: