このコマンドは PostgreSQL プランナが与えられた問い合わせに対して作成する実行計画を表示します。実行計画はテーブルが、単純な順スキャン、インデックススキャン、などによってどのように問い合わせに参照されるか、そしてもし複数のテーブルが参照される場合、どの結合アルゴリズムがそれぞれの入力テーブルからの必要とされるタプルを結合するために使われるかを表示します。
表示の中で最も重要な部分は概算された問い合わせ実行コストで、これはプランナが問い合わせを実行するのにどれくらい時間がかかるか(ディスクページ取り出しを単位として計算されます)を推量したものです。実際は二つの数字が表示されます。最初のタプルが返される前の始める時間、そして全てのタプルが返されるまでの合計の時間です。ほとんどの問い合わせにとって重要なのは合計時間ですが、EXISTS 副問い合わせなどのようなコンテクストではプランナは最少の合計時間の代わりに最少の開始時間を選びます(なぜならエクゼキュータはどっちみち 1 つのタプルを得ると停止するからです)。更に、もし LIMIT 句で返すタプル数を制限する場合、プランナはどの計画が一番低コストになるかを概算するため処理の終了までにでふさわしい書き換えを行ないます。
ANALYZE オプションは、計画させるだけではなく、実際にその問い合わせを実行させます。各計画ノードにて費やされた総経過時間(ミリ秒単位)と実際に返される行数が表示に追加されます。プランナの推測と実際の値がどれだけ近いかを確認できるという点でこのオプションは有用なものです。
VERBOSE オプションはただの要約だけではなく、完全な計画ツリーの内部表現を出力します(そして postmaster ログファイルにも送ります)。通常このオプションは PostgreSQL のデバッグにのみ役立ちます。
Caution |
ANALYZE を使用した場合は、問い合わせが実際に実行されることは忘れないで下さい。 EXPLAIN は SELECT が返すはずの出力を全く表示しませんが、問い合わせの副作用は通常通り発生します。INSERT、UPDATE、DELETE 問い合わせに対して EXPLAIN ANALYZE をデータに影響が出ないように使用したい場合は、以下の方法を使用して下さい。 BEGIN; EXPLAIN ANALYZE ...; ROLLBACK;
|
下記は、一つの int4 列と 128 行を持つテーブル上の単純な問い合わせの問い合わせ計画を表示します。
EXPLAIN SELECT * FROM foo; NOTICE: QUERY PLAN: Seq Scan on foo (cost=0.00..2.28 rows=128 width=4) EXPLAIN
問い合わせにおける equijoin 条件をサポートするインデックスを、上と同じテーブルに付与した場合、 EXPLAIN は異なる計画を表示します。
EXPLAIN SELECT * FROM foo WHERE i = 4; NOTICE: QUERY PLAN: Index Scan using fi on foo (cost=0.00..0.42 rows=1 width=4) EXPLAIN
そして最後に、問い合わせにおけるequijoin 条件をサポートするインデックスを持つ同じテーブルで、集約関数を使用した問い合わせを行う場合、EXPLAIN は下記を表示します。
EXPLAIN SELECT sum(i) FROM foo WHERE i = 4; NOTICE: QUERY PLAN: Aggregate (cost=0.42..0.42 rows=1 width=4) -> Index Scan using fi on foo (cost=0.00..0.42 rows=1 width=4)
特定の表示される数字、そして選択された問い合わせ戦略さえも、プランナの改良によって PostgreSQL のリリース間で異なることに注意してください。