このコマンドは PostgreSQL プランナが PostgreSQL 提供の問い合わせ用に生成する実行計画を表示します。 この実行計画は、この問い合わせによって参照されるテーブル (複数の場合もあり) がスキャンされる方法 (単純なシーケンス、インデックススキャン、など) を示したり、複数のテーブルが参照される場合にはそれぞの入力テーブルに必要なタプルを組み合わすために使用される結合アルゴリズムを示したりします。
この画面で最も重要なのは、問い合わせの実行にかかるコストの見積もりです。コストとは、プランナが推定する、問い合わせの実行にかかる時間 (ディスクページ抽出の単位で計測) です。 実際には 2 つの数が表示されます。最初のタプルが返される前のスタートアップ時間、そして全てのタプルが返されるまでの合計の時間です。 ほとんどの問い合わせにとって問題となるのは合計時間ですが、EXISTS 副問い合わせなどののコンテキストでは、プランナは最も短い合計時間ではなく最も短いスタートアップ時間を選びます (実行プログラムはタプルを 1 つ取得した後に停止するからです)。更に、もし LIMIT 句で返すタプル数を制限する場合、プランナはどの計画が一番低コストになるかを概算するため処理の終了までにでふさわしい書き換えを行ないます。
ANALYZE を使用した場合は、問い合わせが実際に実行されることは忘れないで下さい。各計画ノードにて費やされた総経過時間(ミリ秒単位)と実際に返される行数が表示に追加されます。プランナの推測と実際の値がどれだけ近いかを確認できるという点でこのオプションは有用なものです。
Caution |
ANALYZE を使用した場合は、問い合わせが実際に実行されることを忘れないで下さい。EXPLAIN は SELECT が返すはずの出力を全く表示しませんが、問い合わせの副作用は通常通り発生します。INSERT、UPDATE、DELETE 問い合わせに対して EXPLAIN ANALYZE をデータに影響が出ないように使用したい場合は、以下の方法を使用して下さい。 BEGIN; EXPLAIN ANALYZE ...; ROLLBACK;
|
VERBOSE オプションはただの要約だけではなく、完全な計画ツリーの内部表現を出力します。通常このオプションは PostgreSQL のデバッグにのみ役立ちます。 VERBOSE のダンプの出力の見栄えの良し悪しは、EXPLAIN_PRETTY_PRINT の構成パラメータの設定によります。
下記は、一つの int4 列と 10000 行を持つテーブル上の単純な問い合わせの問い合わせ計画を表示します。
EXPLAIN SELECT * FROM foo; QUERY PLAN --------------------------------------------------------- Seq Scan on foo (cost=0.00..155.00 rows=10000 width=4) (1 row )
インデックスがある場合、インデックス付けが可能な WHERE 条件を持つ問い合わせを使用すると、EXPLAIN は異なる計画を表示します。
EXPLAIN SELECT * FROM foo WHERE i = 4; QUERY PLAN -------------------------------------------------------------- Index Scan using fi on foo (cost=0.00..5.98 rows=1 width=4) Index Cond: (i = 4) (2 rows)
集約関数を使用した問い合わせ計画の例を示します。
EXPLAIN SELECT sum(i) FROM foo WHERE i < 10; QUERY PLAN --------------------------------------------------------------------- Aggregate (cost=23.93..23.93 rows=1 width=4) -> Index Scan using fi on foo (cost=0.00..23.92 rows=6 width=4) Index Cond: (i < 10) (3 rows)
上記の具体的な数字および使用した問い合わせ戦略は、プランナが改良されたことによって PostgreSQL のリリース間で異なることがあるので注意してください。