Sql-Server

使用單個時間分區回收文件組中的可用空間

  • November 7, 2018

- 從SO移到這裡(那裡沒有評論)

問題:

什麼是回收大(數百 GB)文件組中的空間的正確方法,該文件組具有按時間順序排列且沒有索引碎片且不能承受索引碎片的表的單個分區?我聽到很多關於收縮的壞消息(例如http://www.brentozar.com/archive/2009/08/stop-shrinking-your-database-files-seriously-now/)。索引碎片和重建的時間複雜度是我主要關心的問題

背景:

我有一個具有以下屬性的巨大表(幾 TB):

  • 數據僅按時間順序儲存(“C”列)
  • 索引基於維度“A”,然後是列“C”
  • 表基於“A”進行分區,每個分區都有自己的文件組(具有 10% 的 FileGrowth)

因此,數據僅附加到每個分區,並且儲存速度非常快。

我們還想根據時間啟動分區(例如,每季度的分區和維度“A”;同樣每個分區在單獨的文件組中)。但有兩個擔憂:

  • 我們不能承受磁碟空間的浪費(例如,每個歷史分區中有 10% 的可用空間永遠不會再被觸及)。
  • 我們絕對不能承受任何索引碎片(因為有了這麼多的數據,我們的查詢會受到極大的影響)。

如果能夠在每個季度結束後從文件組末尾刪除可用空間,然後將文件組標記為只讀,那就太好了

在分區末尾回收可用空間:

DBCC SHRINKFILE (FileGroupFileName, TRUNCATEONLY)
GO

用於將分區標記為只讀:

ALTER DATABASE [DBNAME]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;

ALTER DATABASE [DBNAME] MODIFY FILEGROUP [FileGroupName] READ_ONLY;
GO

ALTER DATABASE [DBNAME]
SET MULTI_USER;
GO

引用自:https://serverfault.com/questions/683831