私がいつも混乱しているのは、初期費用と総費用です。私はそれを忘れるたびにこれをグーグルで検索します。それは私をここに戻しますが、違いを説明していません。それが私がこの答えを書いている理由です。これは私がPostgresのEXPLAIN
から収集したものです ドキュメント、私が理解しているように説明しました。
フォーラムを管理するアプリケーションの例を次に示します。
EXPLAIN SELECT * FROM post LIMIT 50;
Limit (cost=0.00..3.39 rows=50 width=422)
-> Seq Scan on post (cost=0.00..15629.12 rows=230412 width=422)
これがPgAdminからのグラフィカルな説明です:
(PgAdminを使用している場合は、コンポーネントにマウスを向けてコストの詳細を読み取ることができます。)
コストはタプルとして表されます。例: LIMIT
のコスト はcost=0.00..3.39
post
を順番にスキャンするコスト はcost=0.00..15629.12
。タプルの最初の数字は初期費用です。 2番目の数値は総費用です。 。 EXPLAIN
を使用したため EXPLAIN ANALYZE
ではありません 、これらのコストは見積もりであり、実際の測定値ではありません。
- 初期費用 トリッキーなコンセプトです。これは、そのコンポーネントが開始するまでの時間を表すだけではありません。 。これは、コンポーネントの実行(データの読み込み)を開始してからコンポーネントが最初の行を出力するまでの時間を表します。 。
- 総費用 は、データの読み込みを開始してから出力の書き込みを終了するまでの、コンポーネントの実行時間全体です。
厄介なことに、各「親」ノードのコストには、その子ノードのコストが含まれます。テキスト表現では、ツリーはインデントで表されます。 LIMIT
親ノードであり、Seq Scan
その子です。 PgAdmin表現では、矢印は子から親(データの流れの方向)を指しています。これは、グラフ理論に精通している場合は直感に反する可能性があります。
ドキュメントには、コストにはすべての子ノードが含まれると記載されていますが、親の3.39
の合計コストに注意してください。 子の総コストよりもはるかに小さい15629.12
。 LIMIT
のようなコンポーネントのため、総コストは含まれていません 入力全体を処理する必要はありません。 EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND unique2 > 9000 LIMIT 2;
を参照してください。 Postgresの例EXPLAIN
ドキュメント。
上記の例では、どちらのコンポーネントも行の書き込みを開始する前に処理を行う必要がないため、両方のコンポーネントの起動時間はゼロです。シーケンシャルスキャンは、テーブルの最初の行を読み取り、それを発行します。 LIMIT
最初の行を読み取り、それを発行します。
コンポーネントが行の出力を開始する前に、コンポーネントが多くの処理を実行する必要があるのはいつですか?考えられる理由はたくさんありますが、1つの明確な例を見てみましょう。これは以前と同じクエリですが、現在はORDER BY
が含まれています 条項:
EXPLAIN SELECT * FROM post ORDER BY body LIMIT 50;
Limit (cost=23283.24..23283.37 rows=50 width=422)
-> Sort (cost=23283.24..23859.27 rows=230412 width=422)
Sort Key: body
-> Seq Scan on post (cost=0.00..15629.12 rows=230412 width=422)
そしてグラフィカルに:
もう一度、post
のシーケンシャルスキャン 起動コストはありません。すぐに行の出力を開始します。ただし、このソートにはかなりの起動コストがかかります23283.24
単一の行を出力する前にテーブル全体を並べ替える必要があるため 。並べ替えの合計コスト23859.27
データセット全体が並べ替えられると、並べ替えられたデータが非常に迅速に送信される可能性があるという事実を反映して、起動コストよりわずかに高いだけです。
LIMIT
の起動時間に注意してください 23283.24
ソートの起動時間と正確に同じです。これは、LIMIT
が原因ではありません それ自体は起動時間が長いです。実際には起動時間はゼロですが、EXPLAIN
各親のすべての子コストをロールアップするため、LIMIT
起動時間には、その子の起動時間の合計が含まれます。
このコストのロールアップにより、個々のコンポーネントの実行コストを理解することが困難になる可能性があります。たとえば、LIMIT
起動時間はゼロですが、一見しただけではわかりません。このため、他の何人かの人々が、EXPLAIN
を理解するのに役立つHubertLubaczewski(別名depesz)によって作成されたツールであるexplain.depesz.comにリンクしました。 とりわけ、親の費用から子の費用を差し引くことによって。彼は、自分のツールに関する短いブログ投稿で、他のいくつかの複雑さについて言及しています。