2013-07-22 14 views
1

我開發的一個程序是使用postgresql。該程序正在運行需要很長時間(幾小時或幾天)的plpgsql函數。我想確保這個功能在很長一段時間內運行。如何控制PostgreSQL函數在很長一段時間內運行

我怎麼知道?我不想在函數的循環中使用「raise notice」,因爲這會延長運行時間。

回答

2

您可以通過檢查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過程的成本相比,它相當低。

+0

如何在[文檔](http://www.postgresql.org/docs/9.0/static/sql-notify.html)中使用NOTIFY命令來說明任何通知不會在交易結束之前交付(即直到功能完成)? – alexkovelsky

相關問題