2017-08-24 82 views
1

我有一個未優化的查詢,在1分鐘到14小時的不同時間運行一系列不同的執行時間。數據庫上的CPU利用率,內存和其他併發負載保持不變,可能會導致這種變化?請注意,自動真空過程在午夜運行,並且性能在早上大幅度提高。我的斷言是,由於表碎片,死元組和大量的讀取,同一個表上的統計信息發生變化,從而產生不同的執行計劃。爲了證明這個斷言,我想獲得正在運行的當前查詢的查詢計劃。請注意,我不可能在執行前簡單地使用EXPLAIN查詢。如何獲得postgresql中正在運行的查詢的執行計劃?

+2

https://www.postgresql.org/docs/current/static/auto-explain.html –

+0

AFAIU,這將需要重新啓動數據庫,這也不是一個選項。此外,這對於爲所有長時間運行的查詢產生查詢計劃而不僅僅是有關的查詢。 –

+1

1:這不需要重新啓動,最多隻能重新加載。 2:PostgreSQL必須爲每個查詢生成查詢計劃(除非它已經準備好了,否則它只會制定一次計劃)。 3:這裏唯一的開銷是記錄最小的查詢計劃。只需將auto_explain.log_min_duration設置爲10000即可,因此它必須是10秒查詢等。 –

回答

1

等我找到了它。在postgresql.conf中有兩個用於預加載庫的設置。第一個,shared_preload_libraries,如果沒有重新啓動,將無法工作。但另一個session_preload_libraries會。因此,編輯postgresql.conf中有這一行是:

session_preload_libraries = 'auto_explain' 

然後重新裝入:

pg_ctl reload (or pg_ctlcluster 9.x main reload etc) 

然後改變數據庫來打開它:

alter database smarlowe set auto_explain.log_min_duration=1; 

然後所有新的連接可以獲得自動解釋的計劃。

將持續時間更改爲最適合您的毫秒設置。