我知道可以在psql提示符下使用
\timing
来打开计时,但是理想情况下,我希望有一个脚本可以自动处理所有事情:多次运行查询,清除PostgreSQL缓存每次运行后(可能通过重新启动PostgreSQL的服务),然后输出平均运行时间(并且使用的内存为加号)。#1 楼
广泛使用的工具是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 .. 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
子句。
评论
查看pgbench;您可以使用自定义脚本运行它来执行某些所需的操作。使用包装程序外壳脚本可以停止和重新启动Pg并删除OS磁盘缓存,您将拥有大部分所需的东西。不是dba.stackexchange.com/questions/3148/…的完全相同的副本。