我開發的一個程序是使用postgresql。該程序正在運行需要很長時間(幾小時或幾天)的plpgsql函數。我想確保這個功能在很長一段時間內運行。如何控制PostgreSQL函數在很長一段時間內運行
我怎麼知道?我不想在函數的循環中使用「raise notice」,因爲這會延長運行時間。
我開發的一個程序是使用postgresql。該程序正在運行需要很長時間(幾小時或幾天)的plpgsql函數。我想確保這個功能在很長一段時間內運行。如何控制PostgreSQL函數在很長一段時間內運行
我怎麼知道?我不想在函數的循環中使用「raise notice」,因爲這會延長運行時間。
您可以通過檢查pg_stat_activity
來查看是否爲運行。但是,這不會告訴你函數是否爲進度。
您可以通過將pg_stat_activity
加入來查看是否存在對該表的任何打開(granted = False
)鎖,以檢查該後端是否在任何鎖上被阻止。再次,這不會告訴你它是否正在進行,只是如果它不是沒有卡在鎖上。
如果你想監視一個函數的進度,你需要發出日誌消息或者使用其他黑客來監視進度。您可以(ab)使用NOTIFY
,有效負載爲LISTEN
以獲取進度消息。或者,您可以創建一個序列,每次處理過程中的某個項目時都會調用nextval
;那麼您可以在另一筆交易中SELECT * FROM the_sequence_name;
查看近似進度。
一般來說,我建議將client_min_messages
設置爲notice
或更高,然後RAISE LOG
,以便記錄僅出現在日誌中的消息,而不會發送到客戶端。爲了減少開銷,保留一個計數器並記錄每100或1000或任何迭代的循環,所以你只能偶爾登錄。當然,更新計數器會有成本,但與像這樣的大而慢的PL/PgSQL過程的成本相比,它相當低。
如何在[文檔](http://www.postgresql.org/docs/9.0/static/sql-notify.html)中使用NOTIFY命令來說明任何通知不會在交易結束之前交付(即直到功能完成)? – alexkovelsky