1

我有一个非常大的只读数据库,有大约 30 个表。数据库的总大小约为 13 TB,最大的表约为 4.5 TB。(大约有 10 个大小为 1TB+ 的表,然后是几个较小的表。)目前,数据库被分成 8 个数据文件,都在 PRIMARY 文件组中。

我已经对一些大表应用了 PAGE 级数据压缩,这将 DB 的大小减少到 10TB 左右,但是,我真的很想回收磁盘上的一些空间。(这个数据集是只读的——它永远不会增长。)

我意识到缩小文件会导致大量碎片,这可以通过重建所有索引来解决,但重建索引可能会导致文件再次增长......啊!

这导致了我关于如何在压缩后回收磁盘空间的问题:

  • 我唯一的解决方案是将所有表/数据复制到具有较小文件的新文件组中,删除原始表,然后清空/删除或缩小原始文件吗?
  • 是否有人知道任何脚本或工具可以帮助我确定所需的最佳文件大小?
  • 最好的做法是
    1. 使用聚集索引 + PAGE 压缩在新文件组上创建新表
    2. 从原始表中插入/选择到新表中(使用 TF 610 和 tabblock)
    3. 删除原始表
    4. 在新文件组上创建非聚集索引

这似乎是一项艰巨的任务,需要很长时间,因为我将不得不基本上重新创建我的整个数据库......再次。我缺少一个更简单的解决方案吗?

4

1 回答 1

1

本白皮书涵盖了所有内容:数据压缩:战略、容量规划和最佳实践

数据压缩完成后,节省的空间将释放到相应的数据文件。但是,空间不会释放到文件系统,因为文件大小不会作为数据压缩的一部分自动减小。

有几个选项可以通过减小文件的大小来释放文件系统的空间:

DBCC SHRINKFILE (or) DBCC SHRINKDATABASE :
文件 后DBCC shrink,碎片会增加 。使用ALTER INDEX … REORGANIZE而不是重建。
另请注意,这DBCC SHRINKFILE是单线程的,可能需要很长时间才能完成

如果要压缩文件组中的所有表:
- 创建一个新文件组。
- 压缩时将表和索引移动到新文件组。
在旧文件组中的所有表和索引都被压缩并移动到新文件组后,可以删除旧文件组及其文件以释放文件系统空间。
请注意此方法中的一个警告。如果表在同一文件组中有 LOB_DATA 分配单元,则此方法不会将 LOB_DATA 移动到新文件组(在不同文件组中重新创建聚集索引时,只会移动IN_ROW_DATA和分配单元)。ROW_OVERFLOW_DATA因此旧文件组不会完全为空,因此无法删除。

另一种选择:
如果您要压缩文件组中的所有表,还有另一种解决方案。在新文件组中创建一个空表,对其进行压缩,然后使用 INSERT ... SELECT 将数据复制到新表中。

于 2017-02-13T17:14:44.227 回答