2017-02-13 27 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

相关问题