2017-02-13 80 views
1

我有一個非常大的只讀數據庫,大約有30個表。 DB的總大小約爲13TB,最大的表大約爲4.5TB。 (大小爲1TB +的表格有10個左右,然後是幾個較小的表格。)目前,數據庫被分成8個數據文件,全部在PRIMARY文件組中。在SQL 2014+ VLDB上PAGE數據壓縮後回收磁盤空間

我已經在某些大型表上應用了PAGE級數據壓縮,它將DB的大小減少到了10TB左右,但是,我真的想要回收磁盤上的一些空間。 (這個數據集是隻讀的 - 它永遠不會增長。)

我意識到縮小文件會導致大量的碎片,這可以通過重建所有索引來解決,但重建索引可能會導致文件再一次增長...啊!

導致我的問題(一個或多個)有關如何壓縮後回收磁盤空間:

  • 是我複製所有表/數據分成較小的文件,新文件組,刪除原始表唯一的解決方案,然後清空/放下或縮小原始文件?
  • 是否有人知道任何腳本或工具,將幫助我決定我需要的最佳文件大小?
  • 請問最好的做法是
    1. 創建與聚集索引+ PAGE壓縮新文件組新表
    2. 插入/從原來的表中選擇插入到新表(帶TF 610和TABLOCK)
    3. 滴原表
    4. 創建新的文件組

此非聚集索引看起來像是一個需要很長時間的大事業,因爲我將不得不基本上重新創建我的整個數據庫......再次。有沒有更簡單的解決方案,我錯過了?

+0

另外,在新的FG中創建新的聚簇索引與DROP EXISTING之間是否存在性能差異,或者是在新FG上創建CLI之後只是執行INSERT..SELECT? – capnsue

回答

1

一切都已經涵蓋在本白皮書:數據壓縮已完成Data Compression: Strategy, Capacity Planning and Best Practices

後,節省的空間被釋放到相應的數據文件(S)。但是,空間不會釋放到文件系統,因爲作爲數據壓縮的一部分,文件大小不會自動減少。

有幾個選項通過減少文件(S)的大小以釋放空間,文件系統:

DBCC SHRINKFILE(或)DBCC SHRINKDATABASE:
文件後DBCC shrink,碎片將增加使用ALTER INDEX … REORGANIZE而不重建。
另外要注意,DBCC SHRINKFILE是單線程的,可能需要很長時間才能完成

如果你在壓縮文件組中的所有表:
- 創建一個新的文件組。
- 壓縮時將表和索引移動到新文件組。
將舊文件組中的所有表和索引壓縮並移動到新文件組後,可以刪除舊文件組及其文件,以釋放文件系統的空間。
請注意這種方法的一個警告。如果表的LOB_DATA分配單元位於同一個文件組中,則此方法不會將LOB_DATA移動到新的文件組(只有IN_ROW_DATAROW_OVERFLOW_DATA分配單元在聚集索引在其他文件組中重新創建時才移動)。所以舊的文件組將不會完全空,因此不能被刪除。

多了一個選項:
有,如果你在壓縮文件組中的所有表另一種解決方案。在新文件組中創建一個空表,對其進行壓縮,然後使用INSERT ... SELECT將數據複製到新表中。

+0

謝謝,我已閱讀白皮書,應該提到這一點。想知道是否有人寫過腳本或其他東西來自動化這個過程 - 選擇正確的文件大小等,或者有一些解決方案不需要再次移動所有這些數據...... – capnsue