如何对 PostgreSQL 查询进行基准测试?

Fra*_*urt 41 postgresql benchmark

我想对包含我为 PostgreSQL 编写的用户定义函数的查询进行基准测试。有没有标准的方法来运行这样的基准测试?

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

Erw*_*ter 33

广泛使用的工具是 SQL command EXPLAIN ANALYZE,可能有更多选项以获取答案中的更多详细信息。这会输出带有规划器估计值和实际执行时间的查询计划。

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

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

简单的 UDF

EXPLAIN ANALYZE
SELECT f_myfunc(g) FROM generate_series (1,1000) AS t(g);
Run Code Online (Sandbox Code Playgroud)

或者使用随机输入 - 示例中 0 到 5000 之间的随机数:

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

或者使用现实生活中的表格:

EXPLAIN ANALYZE
SELECT f_myfunc(my_column) FROM my_tbl;   -- LIMIT n
Run Code Online (Sandbox Code Playgroud)

更复杂的函数/查询

CREATE FUNCTION f_test(ct int, sql text)
  RETURNS void
  LANGUAGE plpgsql AS
$func$
DECLARE
   i int;
BEGIN
   FOR i IN 1 .. $1 LOOP
      EXECUTE sql;  -- not safe against SQLi!
   END LOOP;
END
$func$
Run Code Online (Sandbox Code Playgroud)

称呼:

EXPLAIN ANALYZE
SELECT f_test(100, $q$SELECT * from MADLIB.gp('mock3', '{x1, x2, x3}', '{y1}', 100,20, 3)$q$
Run Code Online (Sandbox Code Playgroud)

小心:查询实际上已执行!
注意:不适合公共使用。可能的 SQL 注入。

同样,如果需要,您可以使用随机参数。可能带有 的USING子句EXECUTE

更多选择

  • 查询语句 \timing
  • 总工会 log_duration
  • 手动服务器端计时 clock_timestamp()

有关详细信息,请参阅: