2017-04-18 5 views
0

多くのクエリでベンチマークテストを実行しています。私は一連のクエリを持っており、それらはお互いに複数回実行されます。私はPostgreSQLがクエリプランをキャッシュすることを知っています。これは考慮する必要がありますが、これが常に起こるとは限りません。PostgreSQLは同じクエリでプランキャッシュに近づいていますか?

私には2つのアプローチがあります。私は、(a)クエリプランを強制的に実行してクエリを実行するか、(b)「ウォームアップ」してプランをキャッシュし、毎回再利用するかのいずれかを検討しています。どのように実行すればよいのでしょうか、または何かが起こっていることを確実にするために何を予防措置を取ることができますか?

キャッシュ内のプランを監視できれば大丈夫ですが、可能かどうかはわかりません。

更新:私のクエリは、データを取得するための複雑なSELECTであり、DELETE/INSERTなどはありません。これは、ベンチマークでクエリプランナにあまり敬意を払うべきではありませんか?

  • は、あなたがあなたのクエリがあればなってどのくらい速いのベンチマークにしたい場合は文がPL/pgSQL機能

だから、内部で実行される

  • プリペアドステートメントを使用している場合

  • 答えて

    1

    PostgreSQLは唯一の問い合わせ計画をキャッシュプランニングのオーバーヘッドを避けるためには、プリペアドステートメントを作成して少なくとも6回実行する必要があります(最初の5回は常にカスタムプランを生成するため)。

    クエリが複雑な場合、特にクエリの実行時間が長い場合は、クエリプランをキャッシュすると失われる可能性があります。このような場合は、通常、各クエリの計画に多くの労力を費やす方がよいでしょう。プリペアドステートメントで最大の勝利は、クエリの実行時間が短い場合です。

    +0

    ありがとうございます!準備されたステートメントによる計画のオーバーヘッドなしにベンチマークを提案します。また、PostgreSQLもPL/pgSQL関数を介してクエリプランをキャッシュしていると言います。つまり、PL/pgSQLプロシージャを使用して少なくとも5回実行すると同じ動作が期待できることを暗示しています。 6回目以降は? – Zeruno

    +0

    はい、大丈夫です。時々PostgreSQLはジェネリックプランが十分ではないと判断し、カスタムプランを作成し続けます。テストするには、関数内のステートメントに対して 'EXPLAIN EXECUTE prepared_statement'またはauto_explainを使用できます。そこに '$ 1'がある場合、一般的な計画が使用されます。パラメータのないステートメントはもちろん、常に汎用プランを使用します。 –

    +0

    あなたのよく説明された返信をありがとう!非常に役立ちます。 – Zeruno

    関連する問題