EXPLAIN

Name

EXPLAIN  --  文の実行計画の表示

Synopsis

EXPLAIN [ VERBOSE ] query        
  

入力

VERBOSE

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

query

任意の query です。

出力

NOTICE: QUERY PLAN: plan

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

EXPLAIN

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

説明

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

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

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

注釈

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

互換性

SQL92

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