首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SQL 2014+ VLDB上压缩页数据后回收磁盘空间

在SQL 2014+ VLDB上压缩页数据后回收磁盘空间
EN

Stack Overflow用户
提问于 2017-02-13 16:55:28
回答 1查看 1.8K关注 0票数 1

我有一个很大的只读数据库,有30张表.DB的总规模约为13 TB,最大的表约为4.5TB。(大约有10个大小为1TB+的表,然后是几个较小的表。)目前,DB被分成8个数据文件,全部位于主文件组中。

我已经在一些大型表上应用了页面级数据压缩,这使得DB的大小减少到了大约10 DB,但是,我真的很想收回磁盘上的一些空间。(这个数据集是只读的--它永远不会增长。)

我意识到缩小文件会导致大量的碎片,这可以通过重建所有的索引来修复,但是重新构建索引可能会导致文件在整个again...argh上增长!

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

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

这似乎是一项需要很长时间的大任务,因为我将不得不基本上重新创建我的整个database...again。有更简单的解决办法吗?

EN

回答 1

Stack Overflow用户

发布于 2017-02-13 17:14:44

这篇白皮书涵盖了所有的内容:数据压缩:策略、容量规划和最佳做法

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

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

DBCC SHRINKFILE (或) DBCC SHRINKDATABASE :

DBCC shrink文件之后,碎片将increase.use ALTER INDEX … REORGANIZE而不是重新构建。

还要注意,DBCC SHRINKFILE是单线程的,可能需要很长时间才能完成。

如果正在压缩文件组中的所有表:

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

还有一个选择:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42209394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档