2016-11-19 16 views
0

在一个复杂的网页上执行了超过一百个查询。我寻找一种方法来对这些查询进行基准测试。 我试图将EXPLAIN ANALYZE嵌入到查询中。到psql函数中,选择每个查询的执行时间并进行比较。 但EXPLAIN ANALYSE似乎不能以任何方式嵌入。对许多PostgreSQL查询进行基准对比

是否有另一种解决方案来比较一些查询的执行时间?

非常感谢

+1

[错误报告和记录](https://www.postgresql.org/docs/current/static/runtime-config-logging.html)和[pg_stat_statements](https://www.postgresql.org/docs /current/static/pgstatstatements.html)PS:“_在一个复杂的网页上执行超过**百个**查询。” - 现在我知道为什么网络变得越来越慢:o( – Abelisto

回答

2

有与嵌入EXPLAIN没有问题,PL/pgSQL的:

CREATE OR REPLACE FUNCTION profile(
     IN query text, 
     OUT total_cost double precision, 
     OUT runtime double precision 
    ) RETURNS record 
    LANGUAGE plpgsql STRICT AS 
$$DECLARE 
    j json; 
BEGIN 
    EXECUTE 'EXPLAIN (ANALYZE, FORMAT JSON) ' || query INTO j; 
    total_cost := (j->0->'Plan'->>'Total Cost')::double precision; 
    runtime := (j->0->'Plan'->>'Actual Total Time')::double precision; 
    RETURN; 
END;$$; 

可以按如下方式使用它,例如:

test=> SELECT * FROM profile($$SELECT * FROM large WHERE val = 'mama'$$); 
┌────────────┬─────────┐ 
│ total_cost │ runtime │ 
├────────────┼─────────┤ 
│ 14542.43 │ 207.836 │ 
└────────────┴─────────┘ 
(1 row) 

不要使用它带有不可信的查询,因为该函数容易受到SQL注入的影响。

+0

谢谢,这正是我需要的。 –