2012-03-13 35 views
4

我正在考慮爲即將推出的項目提供各種支持MVCC的數據庫,並將PostgreSQL引入我的視線。我可以每1-2分鐘運行一次PostgreSQL真空吸塵器嗎?

我的程序的要求,包括大致是如下順序:

  1. 從數據庫中讀取當前版本的一些信息,修改數據的80%-90%,並在一個寫回或更多的交易(想象在Conway的生命遊戲中更新網格,需要網格的新老狀態)。

  2. 等待提交後1-2分鐘。在此期間,客戶可以針對新數據發佈讀取內容。

  3. 重複。

數據庫將被限制在2-4GB之類。

〜90%的變化是對現有對象的更新,〜5%將是新對象,〜5%將被刪除對象。

所以我的問題是,我可以合理地每隔1-2分鐘運行一次普通的VACUUM命令作爲步驟1.5,並讓PostgreSQL能夠跟上每次可能的2-3 + GB的更改嗎?

+5

您可能不需要手動運行它。調整該特定表的自動真空設置應該足夠了。但是,當您刪除或插入大量行時,真空是非常必要的。更新將不需要這樣一個積極的真空。 – 2012-03-13 22:50:55

+0

我的理解是,每次更新都會生成一個新的XID記錄,並且由於每個循環都會更新80-90%的對象,因此我期望有許多「舊」記錄進行清理。 – MindJuice 2012-03-13 22:56:09

+0

也許同樣重要的是要注意,在步驟1運行時,客戶端也可能會從步驟「0」發出針對數據庫的「舊」狀態的讀取,因此這些舊記錄需要在新記錄時可用產生。 – MindJuice 2012-03-13 22:59:18

回答

5

我相信Postgres在這種情況下應該可以做得很好。這種情況非常罕見,巨大更新之間的手動真空似乎是一個合理的選擇。

請考慮如果您可以讓它代替巨大的更新,您將生成一組新的表,分析它們(必要的!),然後用事務性ddl刪除舊的並重新命名新的一個到他們的位置。這應該可以緩解您對VACUUM的擔憂。

在這種情況下,你應該做一些認真的調整。特別是,查看shared_buffers,與檢查點相關的參數以及與真空有關的參數。此外,請記住關於實際工作負載的基準測試。

+0

關於在最後使用兩個單獨的表並重命名的有趣建議。這可能對我有用。我會仔細思考一下。謝謝! – MindJuice 2012-03-14 00:12:10

+0

要重命名錶,數據庫首先必須鎖定表。這比更新的普通行鎖要慢得多。 – 2012-03-14 07:46:16

+1

@FrankHeikens:這是一個折衷,OP想要更新幾乎整個表,簡單的排他鎖可能比處理VACUUM和東西更容易。如果讀者僅發佈短期查詢,情況尤其如此。或者,可以想象在客戶端這麼做 - 小型search_path舞蹈可能意味着「舊」讀者使用舊模式中的表,新讀者​​使用新模式中的表,而在後臺您正在準備另一個版本。然後你放棄任何人不再使用的模式。 – maniek 2012-03-14 12:24:49

相關問題