2017-09-05 74 views
-1

我有一个生产SQL Server 2008,其中8 TB遍布多个数据库。 我已经删除了大约85%的数据,并且必须恢复磁盘空间。 所有USED_SPACE的最终总和为1.2 TB。提高SQL Server DBCC SHRINKFILE的性能

SHRINKFILE过程必须适合每个数据库7小时的维护时段。

但是每个人的DBCC SHRINKFILE需要MANY几个小时才能运行。例如,将800 GB数据库缩小至120 GB需要15个小时以上。

不幸的是,超过了我的维护窗口,我不得不杀死这个进程,希望数据库不会被破坏(后面的DBCC CHECKDB显示它们很好)。

我可以看到DBCC SHRINKFILE没有充分利用可用的磁盘I/O和CPU资源。

例如,可以在几个小时内将完整大小的数据库文件从一个磁盘复制到另一个磁盘,但SHRINKFILE过程需要相当长的时间。

注意:数据库全部设置为SIMPLE恢复模式并且AUTO_SHRINK已关闭。

是的,我看到很多人说永远不会这样做,因为它破坏索引 - 我打算在SHRINKFILE完成时重建索引。

有没有办法提高SHRINKFILE命令或其他解决方案的优先级?以下是我正在考虑的一些选项:

  • SET DEADLOCK_PRIORITY HIGH在运行SHRINKFILE之前的同一会话中。 (但我怀疑这会有帮助。)
  • 创建一个新的数据库并逐个复制所有数据。

请帮忙。

+2

这实际上与**编程**(其中*本站*全部是关于**)没有任何关系,但是使用数据库管理 - 因此它在这里是脱离主题并属于[dba。 stackexchange.com](http://dba.stackexchange.com) - 投票移动。 –

+0

你说得对。有没有办法移动它 - 或者我应该在那里创建一个新的? – Don

+0

系统将迁移它,一旦共有五张选票迁移它 –

回答

0

DBCC SHRINKFILE id单线程操作,所以它在服务器上占用太多时间。

解决方法:首先重建与MAXDOP *指数(因为这会安排数据和索引)

然后执行DBCC SrinkFiles。

Maxdop - 您想查询的线程数量可以使用。

+0

我试过了,但没有缩短缩短时间。它看起来是对所有数据页面进行碎片整理。我注意到,通过与数据库的任何连接的活动似乎几乎暂停收缩过程。防止任何连接是目前似乎有用的唯一操作。 – Don