EXPLAIN

Name

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

Synopsis

EXPLAIN [ ANALYZE ] [ VERBOSE ] query        
  

入力

ANALYZE

この問い合わせの実行用、および実際の実行時間の表示用のフラグです。

VERBOSE

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

query

任意の query です。

出力

問い合わせ計画

PostgreSQL プランナによる明示的な問い合わせ計画です。

Note: PostgreSQL の 7.3 より前のバージョンでは、問い合わせ計画は NOTICE メッセージという形式で通知されていました。 現在では、問い合わせ計画は問い合わせ結果 (単一のテキスト列から成るテーブルの形式で) として表示されます。

説明

このコマンドは PostgreSQL プランナが PostgreSQL 提供の問い合わせ用に生成する実行計画を表示します。 この実行計画は、この問い合わせによって参照されるテーブル (複数の場合もあり) がスキャンされる方法 (単純なシーケンス、インデックススキャン、など) を示したり、複数のテーブルが参照される場合にはそれぞの入力テーブルに必要なタプルを組み合わすために使用される結合アルゴリズムを示したりします。

この画面で最も重要なのは、問い合わせの実行にかかるコストの見積もりです。コストとは、プランナが推定する、問い合わせの実行にかかる時間 (ディスクページ抽出の単位で計測) です。 実際には 2 つの数が表示されます。最初のタプルが返される前のスタートアップ時間、そして全てのタプルが返されるまでの合計の時間です。 ほとんどの問い合わせにとって問題となるのは合計時間ですが、EXISTS 副問い合わせなどののコンテキストでは、プランナは最も短い合計時間ではなく最も短いスタートアップ時間を選びます (実行プログラムはタプルを 1 つ取得した後に停止するからです)。更に、もし LIMIT 句で返すタプル数を制限する場合、プランナはどの計画が一番低コストになるかを概算するため処理の終了までにでふさわしい書き換えを行ないます。

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

Caution

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

BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;
      

VERBOSE オプションはただの要約だけではなく、完全な計画ツリーの内部表現を出力します。通常このオプションは PostgreSQL のデバッグにのみ役立ちます。 VERBOSE のダンプの出力の見栄えの良し悪しは、EXPLAIN_PRETTY_PRINT の構成パラメータの設定によります。

注釈

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

使用方法

下記は、一つの int4 列と 10000 行を持つテーブル上の単純な問い合わせの問い合わせ計画を表示します。

EXPLAIN SELECT * FROM foo;
                           QUERY PLAN
---------------------------------------------------------
 Seq Scan on foo  (cost=0.00..155.00 rows=10000 width=4)
(1 row )
    
   

インデックスがある場合、インデックス付けが可能な WHERE 条件を持つ問い合わせを使用すると、EXPLAIN は異なる計画を表示します。

EXPLAIN SELECT * FROM foo WHERE i = 4;
                             QUERY PLAN
--------------------------------------------------------------
 Index Scan using fi on foo  (cost=0.00..5.98 rows=1 width=4)
   Index Cond: (i = 4)
(2 rows)
    
   

集約関数を使用した問い合わせ計画の例を示します。

EXPLAIN SELECT sum(i) FROM foo WHERE i < 10;
                                 QUERY PLAN
---------------------------------------------------------------------
 Aggregate  (cost=23.93..23.93 rows=1 width=4)
   ->  Index Scan using fi on foo  (cost=0.00..23.92 rows=6 width=4)
         Index Cond: (i < 10)
(3 rows)
    
   

上記の具体的な数字および使用した問い合わせ戦略は、プランナが改良されたことによって PostgreSQL のリリース間で異なることがあるので注意してください。

互換性

SQL92

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