2010-04-19 39 views
2

我有大約10個表超過200萬條記錄和一個3000萬。我想從每個表中有效地移除較舊的數據。高效修剪postgresql表

我一般的算法是:

  • 創建一個臨時表中的每個大表,並用新的數據來填充它
  • 截斷原始表
  • 複製tmp目錄數據重新使用原來的表:「插入into originaltable(select * from tmp_table)「

但是,將數據複製回去的最後一步比我想要的要長。我想過刪除原始表並使臨時表「永久」,但我失去了約束/外鍵信息。

如果我直接從表中刪除,則需要更長的時間。鑑於我需要保留所有外鍵和約束,是否有更快的方法來刪除舊數據?

謝謝。

回答

2

最快的過程很可能是完全按照您已經概述:

  1. 複製新的數據到臨時表
  2. 刪除索引鍵和外鍵
  3. 刪除舊錶
  4. 複製臨時表回到舊錶名
  5. 重建索引和外鍵。

The Postgres manual對性能也有一些建議,也可能適用或不適用。坦率地說,刪除表比刪除數百萬行要快得多(因爲每個刪除都是通過元組執行的),並且將數百萬行插入沒有約束或索引的表中的速度明顯更快(因爲每個約束必須檢查每個記錄插入的每個索引,並且必須更新每個索引;通過刪除所有約束,將其限制爲索引的單個構建和對約束的單個驗證。

1

這些問題的「標準」解決方案通常涉及將表格分區到相應的鍵上,這樣,當您需要刪除舊數據時,您可以簡單地刪除整個分區 - 當然是您獲得的最快刪除。

然而,PostgreSQL的劃分並不像某些其他數據庫一樣簡單 - 你需要手動使用觸發器重新定位數據,並有警告(例如沒有全球性的主鍵)

PostgreSQL manual on Partitioning