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」。有沒有辦法做到這一點 ? –