我有一个非常大的只读数据库,有大约30个表。数据库的总大小约为13TB,最大的表大约为4.5TB。 (大约有1个表大小为1TB +,然后是几个较小的表。)目前,数据库被分成8个数据文件,所有这些都在PRIMARY文件组中。
我已经在某些大型表上应用了PAGE级数据压缩,这将DB的大小减小到10TB左右,但是,我真的想要回收磁盘上的一些空间。 (这个数据集是只读的 - 它永远不会增长。)
我意识到缩小文件会导致大量碎片,这可以通过重建所有索引来解决,但重建索引可能会导致文件再次增长......唉!
这引出了我关于如何在压缩后回收磁盘空间的问题:
这似乎是一项需要很长时间的大事,因为我将不得不再次基本上重新创建我的整个数据库。我有一个更简单的解决方案吗?
答案 0 :(得分:1)
本白皮书涵盖了所有内容:Data Compression: Strategy, Capacity Planning and Best Practices
数据压缩完成后,保存的空间将释放到相应的数据文件中。但是,空间不会释放到文件系统,因为文件大小不会作为数据压缩的一部分自动减少。
有几种方法可以通过减小文件大小来释放文件系统的空间:
DBCC SHRINKFILE(或)DBCC SHRINKDATABASE:
在DBCC shrink
文件之后,碎片会增加。使用ALTER INDEX … REORGANIZE
而不是重建
另请注意,DBCC SHRINKFILE
是单线程的,可能需要很长时间才能完成
如果要压缩文件组中的所有表格:
- 创建一个新的文件组
- 压缩时将表和索引移动到新文件组
在旧文件组中的所有表和索引都已压缩并移动到新文件组之后,可以删除旧文件组及其文件以释放文件系统的空间。
请注意此方法中的警告。如果表在同一文件组中具有LOB_DATA分配单元,则此方法不会将LOB_DATA移动到新文件组(当聚簇索引重新启动时,仅移动IN_ROW_DATA
和ROW_OVERFLOW_DATA
分配单元在另一个文件组中创建)。因此旧文件组不会完全为空,因此无法删除。
还有一个选项:
如果要压缩文件组中的所有表,还有另一种解决方案。在新文件组中创建一个空表,压缩它,然后使用INSERT ... SELECT将数据复制到新表。