什麼阻止了 Postgres 中的查詢
我現在有一個在 Postgres 9.3 中執行超過 24 小時的查詢(即
EXPLAIN ANALYZE VERBOSE
,連結到另一個問題)。我檢查了 pgAdmin 中的“伺服器狀態”,它顯示了查詢“活動”。我執行了一些標準的鎖定檢測,但它沒有返回任何東西。
我不確定為什麼要花這麼長時間:它是否在等待永遠無法獲得的鎖(等待沒有意義)?它只是慢(讓它執行更長時間)嗎?
如果它是相關的,數據庫本身是相當大的(一個外部表上的 5 億行,其他幾百萬行),數據目錄使用 340 GB 磁碟中的 240 GB,所以還剩下大約 100 GB。它是一個 Windows 2012 伺服器,具有 12 GB RAM,剩餘 6 GB。
編輯:查詢本身最終在 28h30 之後完成(因為類似遞歸的 delete),但問題仍然有效:我可以檢查什麼以確保我沒有白等?(刪除 postgresql-9.3 因為最好有一個更一般的答案)
您對鎖表的查詢沒有返回任何內容,這為您的問題提供了答案——它沒有等待鎖。(假設你做對了)。
必須打開一個新會話並執行查詢並解釋結果仍然很煩人且容易出錯,因此我編寫了一個更新檔來在您等待鎖定時發送 NOTICE。有幾種改進方法的提議,但沒有就最佳方法達成共識,所以現在只是一個提議。如果您願意編譯自己的 PostgreSQL,您可以隨時採用此更新檔供您使用。但是,我不知道 pgAdmin 會對此類通知做什麼,因為我使用 psql 而不是 pgAdmin 作為我的主要工具。
正如@a_horse_with_no_name 所指出的,您還可以使用 in 列
pg_stat_activity
來獲取相關資訊。該資訊的質量隨著版本的不同而提高。執行舊版本確實需要付出代價。每隔幾年努力升級一次是值得的。最後,您的系統監控工具非常寶貴。快速瀏覽一下“top”(適用於 Linux)或“Task Manager”(適用於 Windows)可能會立即表明您的工作正忙於做某事——CPU 或磁碟。