Sql-Server
用於歸檔數據的表分區
設想:
- 兩個數據庫:DB_A 和 DB_Archive,其中一個非常大的表稱為 tableA。
- 每天,超過 60 天的記錄都會從 DB_A 中刪除並移至 DB_Archive,主要是為了將事物“分開”,因為在 DB_A 上大量查詢 tableA 以獲取過去 2 個月的記錄。
我想擺脫這個過程,因為它很慢並且消耗大量資源。我正在考慮使用日期列上的分區函式在 DB_A 上實現表分區,並在一個分區上儲存 < 2 個月的所有記錄,在另一個分區上儲存 > 2 個月的所有記錄。我的問題:
- 如果我有 2 個不同的數據庫,這種情況是否會表現得像?如果我在 tableA 中查詢記錄 > getdate() - 30,它會讀取歸檔分區嗎?
- 我想我也必須對索引進行分區,對吧?
- 我該如何處理明天我的分區函式將“改變”的事實,我的意思是,如果我今天創建函式(7 月 2 日,其範圍將是 5 月 2 日,但明天將是 5 月 3 日)。我可以創建動態分區函式嗎?
使用分區,您必須每天進行一個分區,這將 Pre-SQL 2012 的 1000 個分區的限制放在一個新的角度,因為它只允許 3 年的存檔。使用 SQL Server 2012,您可以獲得 15000 個分區,這對於每天 1 個分區來說已經足夠了。
每天您都會添加一個新分區。如果您想移動過去 61 天的分區,您可以高效地完成,但仍然是離線操作。請參閱有效地將分區移動到不同的文件組。
您的所有索引都必須對齊,請參閱分區索引的特殊指南。
購買分區並不是一個容易的決定,它可能是一個相當大的咀嚼……請參閱如何決定是否應該使用表分區。具體來說,您不應該期望通過分區來提高性能。您應該通過按日期時間分群來解決時間序列上的性能問題。
我不知道分區函式是否可以是動態的,但我對此表示懷疑。不走那條路線的一些選擇:
1 - 日曆 DATE 上的分區並每天移出最舊的分區
2 - 創建一個按日期過濾的視圖,並將所有現有查詢指向那裡(這可以通過將基礎表重命名為其他內容並將視圖命名為目前表的名稱來輕鬆管理)。這也可以通過索引更改進行優化。
請記住,如果您在查詢中使用日期欄位,上面的第一個選項會更好地工作。如果你不這樣做,它仍然會比目前過程更快,但查詢不會有很大的改進。如果您可以過濾分區欄位並且優化器知道要查看哪個分區,則分區通常效果最好。