2012-03-02 3 views
1

私は、同じ結果セットを返すのPostgreSQL 8.3.14でクエリを比較しています。クエリの効率を正確に測定するにはどうすればよいですか?

私は、推定総コストを追跡するために、私のクエリにEXPLAINを使用しています。また、クエリを数回実行し、実行に要した合計時間を記録しました。連続して実行すると、より多くのデータがキャッシュされ、実際のキャッシュなしのランタイムが歪むことが理解されます。

それでも私はEXPLAINコストが(キャッシュスキュー付き)合計ランタイムに多少比例することになることを期待します。

私のデータはこれを否定しています。私は4つのクエリを比較しました。

  1. クエリA
    • 総コスト:119 500
    • 平均実行時間:28.101秒
  2. クエリB
    • 総コスト:115 700
    • 平均実行時間: 28.291秒
  3. クエリC
    • 総コスト:116 200
    • 平均実行時間:32.409秒
  4. クエリD
    • 総コスト:93 200
    • 平均実行時間:37.503秒

質問が最後に実行されました。何かがキャッシュ問題のために最速になるはずです。

[SO]:See and clear Postgres caches/buffers?

はどうすれば最も効率的などのクエリで測定することができます:キャッシュなしでクエリを実行しているので、このQ + Aに基づいて困難であると思われますか?

答えて

1

にプランナーが示すクエリのコストは、あなたのインデックスの構造の関数であり、また、関連テーブル内の特定の値の相対的な周波数分析し、その出力を掲示する説明を介してそれらを実行してみてください。 PostgreSQLは、すべてのテーブルのすべてのカラムに表示される最も一般的な値を追跡し、各プランの各ステージがどのくらいの行で動作するかを知ることができます。

この情報は古くなることができます。実際にクエリがどれほどコストがかかっているかを正確に把握しようとしている場合は、VACUUM ANALYZEステートメントを実行することによって、postgres統計が最新であることを確認してください。

それを超えると、プランナーはいくつかのリンゴをオレンジの比較に強制します。シークするのに要する時間とメモリ内の関係でタイトなループを実行するのに要する時間を比較しています。異なるハードウェアは異なる相対速度でこれらの処理を行うことができるため、特に緊密な関係では、ポストグルが間違っていると推測されることがあります。 postgesqlによって収集された統計は、「クエリのパフォーマンス」に関連していないと、連続したクエリによって更新されていません。これらの相対的なコストは、あなたのserver's config file

編集の設定で調整することができます。正確な統計情報を得ることは、正確なクエリ計画にとって重要ですが、オペレータにとっては、PostgreSQLにどのくらいの頻度でどのレベルの詳細を伝えるかが重要です。それらの象徴は集められるべきです。あなたが観察している逸脱は、陳腐化しているか、他のプランナーのパラメータを調整することによって利益を得ることができるという兆候です。

+0

ドキュメントは、 'VACUUM ANALYZE [table]'は、私が含むすべてのテーブルの統計を更新すると言います。連続して実行するたびにより良い統計が得られるため、クエリの比較がスキューすることがあります。 –

0
+0

しかし、これは、どのクエリが最も効率的かを定量的に判断するのに役立つものではありません。問題のある領域を簡単に見つけることはできますが、クエリの効率を比較するのは簡単です。 –

関連する問題