このコマンドは与えられた問い合わせに対して Postgres のプラン ナが生成する実行計画を表示します。 実行計画は、その問い合わせによって参照される(複数)テーブルが どのようにスキャンされるのか、つまり、単純なシーケンシャルス キャンなのか、インデックススキャンなのか等を示します。また、 複数テーブルが参照される場合は、各入力テーブルから必要なタプ ルを合わせて取り出す時にどのような結合アルゴリズムが使われる かも示します。
その表示の中で最も重要な部分は、問い合わせ実行コストの推測値です。 この値は、プランナがその問い合わせを実行する時にどのくらいの時間 がかかるのかを (ディスクページを取り出す回数を単位として測定して、) 推測したものです。 実際には、2 つの値が表示されます。 最初のタプルが返されるまでの起動時間と全タプルが返されるまでの総 時間の 2 つです。 ほとんどの問い合わせでは、総時間が問題になりますが、EXISTS 副問い 合わせのような構文では、プランナは最小の総時間の方ではな く最小の起動時間の方を選択します。 (エクゼキュータが最初の 1 タプルを取り出すまでとりあえず停止する からです。) また、LIMIT 句を使用して、返されるタプル数に制限を付与した場合、 プランナはどの計画が本当に最もコストが低いものかを推測するために、 最終段階でのコストの中で適切な補間を行ないます。
VERBOSE オプションは、単なる要約ではなく、計画ツリーの内部表現を 完全に出力します。 (また、それを postmaster のログファイルにも送信します。) 通常、このオプションは Postgres のデバッグのみに有用です。
1 つの 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)
プランナの改良の結果、表示される特定の値はもちろん、選択され た問い合わせ戦略さえも Postgres のリリースによって異なる可能 性があります。