web-dev-qa-db-ja.com

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

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

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

36

広く使用されているツールは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$

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

ここでも、必要に応じてランダムパラメータを使用できます。おそらくUSINGEXECUTE句を使用します。

31