PostgreSQLクエリをベンチマークするにはどうすればよいですか?


34

PostgreSQL用に作成したユーザー定義関数を含むクエリのベンチマークを行いたいです。そのようなベンチマークを実行する標準的な方法はありますか?

私はタイミングが\timingpsqlプロンプトでオンにできることを知っていますが、理想的にはすべてを自動的に処理するスクリプトが欲しいです:クエリを数回実行し、各実行後にPostgreSQLキャッシュをクリアします(おそらくPostgreSQLの再起動によって)サービス)、および平均実行時間(および使用されるメモリはプラス)を出力します。


3
チェックアウトpgbench; カスタムスクリプトを使用して実行し、必要な処理を実行できます。Pgを停止および再起動し、OSディスクキャッシュを削除するラッパーシェルスクリプトを使用すると、必要なもののほとんどが得られます。
クレイグリンガー

回答:


29

広く使用されているツールはSQLコマンドEXPLAIN ANALYZEであり、回答の詳細を表示するためのオプションが追加されている場合があります。これにより、プランナの見積もりと実際の実行時間を含むクエリプランが出力されます。

なぜキャッシュをクリアしたいのですか?一般的に、より可能性の高いユースケースは、キャッシュが読み込まれることです。それでもそのルートに行きたい場合は、SOの関連する回答があります。

キャッシュをリセットせずに、多くの反復でテストする2つの簡単な方法を次に示します。

シンプルなUDF

EXPLAIN ANALYZE
SELECT f_myfunc(g) FROM generate_series (1,1000) AS t(g);

または、ランダム入力-例では0〜5000の乱数:

EXPLAIN ANALYZE
SELECT f_myfunc((random()*5000)::int) FROM generate_series (1,1000) AS t(g);

または実生活のテーブルで:

EXPLAIN ANALYZE
SELECT f_myfunc(my_column) FROM my_tbl;   -- LIMIT n

より複雑な関数/クエリ

CREATE FUNCTION f_test(ct int, sql text) RETURNS void AS
$func$
DECLARE
   i int;
BEGIN

FOR i IN 1 .. $1 LOOP
    EXECUTE sql;  -- not safe against SQLi!
END LOOP;

END
$func$ LANGUAGE plpgsql

コール:

EXPLAIN ANALYZE
SELECT f_test(100, $x$SELECT * from MADLIB.gp('mock3', '{x1, x2, x3}', '{y1}', 100,20, 3)$x$

注意:クエリは実際に実行されます!
注意:公共の使用には適していません。SQLインジェクションの可能性。

繰り返しますが、必要に応じてランダムなパラメーターを使用できます。おそらくのUSING条項でEXECUTE

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.