在SQL 2014+ VLDB

时间:2017-02-13 16:55:28

标签: sql-server sql-server-2014 sql-server-2016 vldb

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

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

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

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

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

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

1 个答案:

答案 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_DATAROW_OVERFLOW_DATA分配单元在另一个文件组中创建)。因此旧文件组不会完全为空,因此无法删除。

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