2

我有一个批处理 SQL基准查询,我想执行并计算他们的时间。我不要想要使用命令EXECUTE ANALYZE获取执行计划。如何基准一组PostgreSQL查询?

基础上提出这一方法在这里Get execution time of PostgreSQL query 我写了每个查询包含以下代码

------------------------- 
Query = 'Q1'; 
StartTime := clock_timestamp(); 

PERFORM <** Query 1 goes here **> 

EndTime := clock_timestamp(); 
Duration := 1000 * (extract(epoch from EndTime) - extract(epoch from StartTime)); 
INSERT INTO execution_tests VALUES (Query, StartTime, EndTime, Duration); 
------------------------- 

我同时使用的,而不是SELECT执行查询,并丢弃结果的过程。

这适用于简单的查询,但我有很多具有WITH子句的查询。根据说明书

对于WITH查询,请使用PERFORM,然后将查询放在括号中。 (在这种情况下,查询只能返回一行)。

但是,我需要基准测试的所有WITH查询返回多行。

如何解决这个问题?

回答

1

什么像

do $$ 
declare 
    p json; 
    your_query text := 'select pg_sleep(1.1)'; 
    t interval; 
begin 
    execute 'explain (analyse, format json) ' || your_query into p; 
    raise info '%', p; 
    t := make_interval(secs := ((p->0->>'Planning Time')::float + (p->0->>'Execution Time')::float)/1000); 
    raise info '%', t; 
end $$; 
+0

太好了!谢谢 !如何在RAISE INFO后删除CONTEXT消息?我已经尝试了ALTER DATABASE test3 SET log_error_verbosity = TERSE;但没有工作。附:我正在执行pgAdmin –

+0

@EstebanZimanyi不确定你的意思。这只是一个例子。据我了解,你想存储执行时间到表... – Abelisto

+0

确实,但它也将是很好的(不一定在这个特殊的例子)删除所有消息,如“上下文:PL/pgSQL函数test_queries()线每当在执行长脚本时在屏幕上显示消息时,例如基于具有不同比例因子的长批次查询来进行基准测试,“在RAISE处为262”。有没有办法做到这一点 ? –