sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLの説明は正確に何を教えてくれますか?

    私がいつも混乱しているのは、初期費用と総費用です。私はそれを忘れるたびにこれをグーグルで検索します。それは私をここに戻しますが、違いを説明していません。それが私がこの答えを書いている理由です。これは私が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.12LIMITのようなコンポーネントのため、総コストは含まれていません 入力全体を処理する必要はありません。 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にリンクしました。 とりわけ、親の費用から子の費用を差し引くことによって。彼は、自分のツールに関する短いブログ投稿で、他のいくつかの複雑さについて言及しています。



    1. MSAccessのテーブル関係の種類

    2. pg gemのインストールに失敗すると、mkmf.rbはrubyのヘッダーファイルを見つけることができません(Mac OSX 10.6.5)

    3. 外部からDockerコンテナでPostgresqlに接続する

    4. PGAdminからCSVファイルをインポートしようとしたときにアクセスが拒否されました