2012-04-13 1 views
34

私は450万行のテーブルを持っています。主キーはありません。テーブルには、整数p_idの列があります。 btreeメソッドを使用してこの列にインデックスidx_mytable_p_idがあります。私が行いますポストグルを理解するとビットマップヒープ/インデックススキャンが説明されます

SELECT * FROM mytable WHERE p_id = 123456; 

私はこの上で説明し、次の出力を参照実行します。なぜ、そのクエリは、ヒープスキャンして、ビットマップ索引をやっている

  • Bitmap Heap Scan on mytable (cost=12.04..1632.35 rows=425 width=321) 
        Recheck Cond: (p_id = 543094) 
        -> Bitmap Index Scan on idx_mytable_p_id (cost=0.00..11.93 rows=425 width=0) 
         Index Cond: (p_id = 543094) 
    

    質問スキャン?

  • なぜ425行が検査されますか?なぜ操作の幅は321ですか?
  • 12.04..1632.35と0.00..11.93の費用はいくらですか?

レコードの場合、p_idの値が123456の773行があります。mytableには38個の列があります。

ありがとうございます!

答えて

52

ことがあるのはなぜヒープスキャンとビットマップインデックススキャンのクエリですか?

正確にはありません。 EXPLAIN出力は、実行ノードの構造を示します。実行ノードの構造は、「より高い」レベル(遠くにインデントされていない)で、ノードの下のノードから行を引きます。ビットマップ・ヒープ・スキャン・ノードが最初の行を引くと、ビットマップ・インデックス・スキャンが実行され、使用される行のセットが決定され、最初の行の情報がヒープ・スキャンに渡されます。索引スキャンは索引を渡して、どの行を読み取る必要があるかを判別し、ヒープ・スキャンは実際にそれらを読み取ります。考えられるのは、索引順ではなく、最初から最後までヒープを読み取ることによりランダムアクセスが少なくなることです。特定のページから読み込まれるすべての行は、そのページがロードされたときに読み込まれ、ディスク全体を行き来するのではなく、より安価なシーケンシャルアクセスを使用してください。

なぜ425行が検査されますか?

そうではありません。あなたは見積もりと選択した計画を示すEXPLAINを実行しましたが、実際に行を調べるわけではありません。 EXPLAIN ANALYZEを実行すると比較してEXPLAINの価値はかなり低くなります。実際にはとなり、推定値と実際のが表示されます。

なぜ操作の幅は321ですか?

明らかに、それはタプルのサイズ(バイト単位)はmytableです。

12.04..1632.35と0.00..11.93のコストはいくらですか?

最初の数字は、そのノードから最初の行を返すためのコストです。 2番目の数値は、そのノードのすべての行を戻すためのコストです。これらは見積もりです。単位は抽象的なコスト単位です。絶対数は何も意味しません。計画において重要なのは、どの計画が最もコストが低いかということです。カーソルを使用している場合は、最初の数字が重要です。それ以外の場合は通常は2番目の数字です。 (LIMIT句を補間すると思う)

環境内のコストを正確にモデル化するには、多くの場合、random_page_costcpu_tuple_costなどの構成可能なコスト要因を調整する必要があります。このような調整がなければ、比較コストは対応する実行時間と一致しない可能性があるため、最適ではない計画が選択される可能性があります。

+1

内部操作の合計コストは、外部操作の起動コストに常に含まれます。 – vyegorov

+0

@vyegorovは正しいです、EXPLAIN ANALYZEの**実際の**データについては、**ループ回数**でノードの総所要時間を除算して反復ごとの時間を表示することに注意してください。予想通り、囲みノードに含まれるノードの合計時間です。 – kgrittn

13

re 1)実行計画は、最も内側のノードから最も外側のノードまで読み取る必要があります。したがって、まず索引スキャン(行の検索)を行い、実際の表にアクセスして索引スキャンが検出した行を戻します。

2)計画に表示されている行数は、そのように425対773の音はかなり合理的です。あなたは本当数字を見たい場合は、コストの図の最初の数字はプランナーのステップをintializeするコストを「スタートアップ」、第二のコストは、そのステップの総コストです)3再explain analyze

を使用。

これは、すべてのマニュアルに記載されています http://www.postgresql.org/docs/current/static/using-explain.html

あなたは、同様のPostgreSQLのWikiでこれらのリンクを経由する場合があります

PostgreSQL EXPLAIN
Using Explain

関連する問題