他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

EXPLAIN

Name

EXPLAIN  --  問い合わせ文の実行計画の表示

Synopsis

EXPLAIN [ ANALYZE ] [ VERBOSE ] query        

入力

ANALYZE

問い合わせを実行し、実際の実行時間を表示するフラグです。

VERBOSE

問い合わせ計画の詳細表示用のフラグです。

query

任意の query です。

出力

NOTICE: QUERY PLAN: plan

PostgreSQL バックエンドからの明示的な問い合わせ計画です。

EXPLAIN

問い合わせ計画の表示の後に送られるフラグです。

説明

このコマンドは PostgreSQL プランナが与えられた問い合わせに対して作成する実行計画を表示します。実行計画はテーブルが、単純な順スキャン、インデックススキャン、などによってどのように問い合わせに参照されるか、そしてもし複数のテーブルが参照される場合、どの結合アルゴリズムがそれぞれの入力テーブルからの必要とされるタプルを結合するために使われるかを表示します。

表示の中で最も重要な部分は概算された問い合わせ実行コストで、これはプランナが問い合わせを実行するのにどれくらい時間がかかるか(ディスクページ取り出しを単位として計算されます)を推量したものです。実際は二つの数字が表示されます。最初のタプルが返される前の始める時間、そして全てのタプルが返されるまでの合計の時間です。ほとんどの問い合わせにとって重要なのは合計時間ですが、EXISTS 副問い合わせなどのようなコンテクストではプランナは最少の合計時間の代わりに最少の開始時間を選びます(なぜならエクゼキュータはどっちみち 1 つのタプルを得ると停止するからです)。更に、もし LIMIT 句で返すタプル数を制限する場合、プランナはどの計画が一番低コストになるかを概算するため処理の終了までにでふさわしい書き換えを行ないます。

ANALYZE オプションは、計画させるだけではなく、実際にその問い合わせを実行させます。各計画ノードにて費やされた総経過時間(ミリ秒単位)と実際に返される行数が表示に追加されます。プランナの推測と実際の値がどれだけ近いかを確認できるという点でこのオプションは有用なものです。

VERBOSE オプションはただの要約だけではなく、完全な計画ツリーの内部表現を出力します(そして postmaster ログファイルにも送ります)。通常このオプションは PostgreSQL のデバッグにのみ役立ちます。

Caution

ANALYZE を使用した場合は、問い合わせが実際に実行されることは忘れないで下さい。 EXPLAIN は SELECT が返すはずの出力を全く表示しませんが、問い合わせの副作用は通常通り発生します。INSERT、UPDATE、DELETE 問い合わせに対して EXPLAIN ANALYZE をデータに影響が出ないように使用したい場合は、以下の方法を使用して下さい。

BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;

注釈

PostgreSQL のオプティマイザにおけるコスト情報の使用に関するドキュメントは多くありません。さらに詳しい情報は、プログラマガイド を参照してください。

使用方法

下記は、一つの 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 のリリース間で異なることに注意してください。

SQL92

SQL92 では EXPLAIN は定義されていません。