我正在嘗試在 SQL 中對一個巨大的表進行磁區。它的大小為 15 TB,有數百萬條記錄。主要思想是通過在當前磁盤不能再擴展的地方創建新的檔案組來將即將到來的資料保存到不同的磁盤上。
我創建了所需的檔案組、檔案、磁區模式和磁區函式,但是當我創建聚集索引時,它占用了太多空間(超過 200GB)并且仍在運行,所以我停止了它。
我的問題:有沒有辦法在不創建占用太多空間的聚集索引的情況下對現有的大表進行磁區?或者有沒有辦法將新的資料保存到不同的磁盤?
uj5u.com熱心網友回復:
為了避免創建 15TB 索引的痛苦(當然,您可以在新磁盤上的新檔案組上創建),您可以改為創建一個新的磁區表(或者不磁區,如果您不需要管理/歸檔) /清除舊資料)從頭開始寫入所有新傳入資料,然后慢慢移動資料。
從我自己的答案借用這里:
- 在新磁盤上創建一個新的磁區表,其中有足夠的磁區來愉快地劃分所有現有的和一些合理的未來資料
- 創建一個
union all包含兩個表的視圖(可能最簡單的方法是重命名當前表并臨時將其替換為具有舊表名的視圖) - 將新寫入直接寫入新的磁區表
- 希望您通過存盤程序或更改目標名稱的最小位置控制寫入
- 如果沒有,您可以在視圖上使用而不是觸發器來直接寫入磁區表
- 在后臺,開始
delete top (@batchsize) output deleted.* into new_table from old_table- 這與完成所有作業需要多長時間無關,訣竅是優化批量大小,以便在完成作業和不會導致阻塞時間過長之間取得平衡,并確保在每個日志之間放入一些日志備份n 批次,如果他們還沒有足夠頻繁地安排(這里有更多資訊)
- 回填所有資料后,您可以洗掉舊表,然后將視圖更改為不再
union all(或洗掉它并重命名新表)
如果將所有舊資料回填到新磁區方案需要兩周時間,那又如何?用戶不會等待兩周;他們只是在等待任何單個批次(即使如此,這在很大程度上只是查詢正在移動的資料的人,而不是新資料)。
uj5u.com熱心網友回復:
主要思想是通過在當前磁盤不能再擴展的地方創建新的檔案組來將即將到來的資料保存到不同的磁盤上。
或者有沒有辦法將新的資料保存到不同的磁盤?
是的。磁區對于這個是非常矯枉過正的。只需將新檔案添加到現有檔案組并將新檔案放在新磁盤上。由于 SQL Server 的比例填充演算法,幾乎所有新分配都將來自新磁盤上的新檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/335775.html
標籤:sql-server 文件 分区 文件组
上一篇:遍歷txt檔案
