37

450万行のテーブルがあります。主キーはありません。テーブルには、p_id整数型の列があります。idx_mytable_p_idこの列には、btreeメソッドを使用したインデックスがあります。そうです:

SELECT * FROM mytable WHERE p_id = 123456;

これについてExplainを実行すると、次の出力が表示されます。

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の費用はいくらですか?

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

ありがとう!

4

2 に答える 2

56

そのクエリがヒープスキャンを実行してからビットマップインデックススキャンを実行するのはなぜですか?

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

なぜ425行を調べているのですか?

そうではありません。EXPLAINを実行しました。これは、見積もりと選択した計画を表示するだけで、実際には行をまったく調べません。そのため、実際にクエリを実行して見積もりと実際の数値を表示するEXPLAIN ANALYZEを実行する場合と比較して、EXPLAINの値はかなり制限されます。

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

どうやらそれは、のタプルのサイズ(バイト単位)ですmytable

12.04..1632.35と0.00..11.93の費用はいくらですか?

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

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

于 2012-04-13T17:51:50.717 に答える
14

re 1)実行プランは、最も内側のノードから最も外側のノードに読み取る必要があります。したがって、最初に(行を見つけるために)インデックススキャンを実行し、実際のテーブルにアクセスして、インデックススキャンで見つかった行を返します。

re 2)計画に示されている行数は、統計に基づく単なる推定値であり、425対773はかなり合理的に聞こえます。実際の数字を見たい場合は、explain analyze

re 3)コスト図の最初の数字は、プランナーのステップを初期化するための「起動」コストであり、2番目のコストはそのステップの合計コストです。

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

PostgreSQLWikiの次のリンクも参照することをお勧めします。

Explainを使用したPostgreSQLEXPLAIN

于 2012-04-13T17:43:32.323 に答える