このコマンドは Postgres プランナが与えられた問い合わせに対して 作成する実行計画を表示します。実行計画は テーブルが、単純な順スキャン、インデックススキャン、などによって どのように問い合わせに参照されるか、そしてもし複数のテーブルが 参照される場合、どの結合アルゴリズムがそれぞれの入力テーブル からの必要とされるタプルを結合するために使われるかを表示します。
表示の中で最も重要な部分は概算された問い合わせ実行コストで、これは プランナが問い合わせを実行するのにどれくらい時間がかかるか (ディスクページ取り出しのユニットで計算されます)を推量したものです。 実際は二つの数字が表示されます。最初のタプルが返される前の始める 時間、そして全てのタプルが返されるまでの合計の時間です。ほとんどの 問い合わせにとって重要なのは合計時間ですが、EXISTS 副問い合わせ などのようなコンテクストではプランナは最少の合計時間の代わりに 最少の開始時間を選びます(なぜならエクゼキュータはどっちみち 1 つの タプルを得ると停止するからです)。更に、もし LIMIT 句で返すタプル 数を制限する場合、プランナはどの計画が一番低コストになるかを 概算するため処理の終了までにでふさわしい書き換えを行ないます。
VERBOSE オプションはただの要約だけではなく、完全な計画ツリー の内部表現を出力します(そして postmaster ログファイルにも 送ります)。通常はこのオプションは Postgres のデバッグにのみ 役立ちます。
下記は、一つの 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 のリリース間で異なることに注意 してください。