我們有成熟的Oracle數據庫應用程序(在生產超過10年),在此期間,我們已經用我們自己設計的腳本來刪除不再需要的舊數據了。他們通過在頻繁提交的循環中針對適當的表發佈刪除語句來工作,以避免使用I/O或使用太多撤銷空間來重載系統。技術在Oracle中刪除舊數據的數據庫
他們工作得很好,大部分。它們每天都在運行,大約需要一個小時才能從系統中刪除最舊的數據。我所關心的主要問題是所有這些刪除操作可能會對錶和索引產生影響,即使它們不會過度加載系統,但在短時間內刪除一天的數據也會產生影響取出實例緩衝區緩存,導致後續查詢在接下來的幾個小時內運行速度稍慢,因爲緩存正在逐漸恢復。
多年來,我們一直在考慮更好的方法。在過去,我聽說人們使用分區表來管理舊數據收割 - 例如每個分區一個月,並且每月刪除最老的分區。這種方法的主要缺點是我們的收割規則超越了「去除X月」的問題。允許用戶根據關鍵值指定數據保留在系統中的時間(例如,在發票表中,賬戶foo可以在3個月後被移除,但賬戶欄可能需要保留2年)。
也有引用完整性的問題; Oracle文檔討論瞭如何使用分區來清除主要在數據倉庫環境中的數據,其中表往往是超立方體。我們更接近OLTP結束的事情,並且X月的數據與Y月的數據有關係很常見。爲這些表創建正確的分區鍵最多隻會發癢。對於高速緩存爆炸,我已經讀了一些關於設置專用緩衝區高速緩存的內容,但似乎更多的是基於每個表的基礎,而不是每個用戶或每個事務的基礎。爲了保留緩存,我真的很喜歡收穫工作,因爲在任何時候只保留緩存中一筆交易的數據,因爲一旦刪除數據就不需要保留數據。
是我們堅持使用刪除可預見的未來,還是有其他的,更聰明的方式來處理與收穫?
+1很好的問題,希望我有一個聰明的解決方案,因爲我可以用它自己;-) – DCookie 2009-06-11 15:41:10
是保持數據不是一個選項?即您可以過濾查詢中的舊記錄(例如,使用VPD謂詞)並且不返回舊記錄。只是說,如果刪除行導致性能問題,我至少會考慮保留它們的可能性不一定是更糟糕的情況。 – 2013-06-19 06:14:23