如何基准化PostgreSQL查询?


34

我想对包含我为PostgreSQL编写的用户定义函数的查询进行基准测试。是否有任何标准方法可以运行此类基准测试?

我知道可以\timing在psql提示符下打开计时,但理想情况下,我希望有一个脚本可以自动处理所有事情:运行查询几次,每次运行后清除PostgreSQL缓存(可能是通过重新启动PostgreSQL的服务),并输出平均运行时间(使用的内存为佳)。


3
签出pgbench; 您可以使用自定义脚本运行它来执行某些所需的操作。使用包装程序外壳脚本来停止和重新启动Pg并删除OS磁盘缓存,您将拥有所需的大部分东西。
Craig Ringer

Answers:


29

广泛使用的工具是SQL命令EXPLAIN ANALYZE,答案中可能包含更多选项以获得更多详细信息。这将输出查询计划以及计划者的估算值以及实际执行时间。

您为什么要清除缓存?通常更可能的用例是填充缓存。如果您仍然想走那条路,这里是SO相关答案

重置缓存,这里有两种简单的方法可以进行多次迭代测试:

简单的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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.