我必须缩小约数据库。 1TB降至700GB左右(这样可以在没有扩展的情况下实现200+ Gb的增长)。我有一个脚本,它将循环和缩小数据库的设置增量(例如1GB)。如果你不得不在任何时候中止,这非常有用,因为进度不会丢失,总收缩操作可能会持续4-5天。问题是,数据库文件以递增为单位缩小(一次执行dbcc shrinkfile)是否会导致更多碎片?谢谢!
答案 0 :(得分:2)
(这是基于MS SQL Server。您的里程可能会因其他RDBMS而异。)
如果其他条件相同,我怀疑你不会因为缩小你的缩小过程而导致更大的碎片化。当文件缩小时,SQL可能必须在内部移动数据,从将被删除的页面移动到不会被删除的空页面。似乎如果块A,B和C将被移动到X,Y和Z然后从数据库文件中删除,那么在三个步骤中执行它将产生与在三个步骤中执行它一样多的碎片。
我看到的问题是,如果你第一次“缩小”块A,在你开始处理块B之前,加载了更多的数据,导致数据库在块D中存储数据,那么该怎么办?以前是空的并且最终收缩的目标?更糟糕的是,如果添加新数据需要重新创建块A,那么你必须再次收缩?
这是一个高级别的尝试来描述我只知道外观的东西。我怀疑多次收缩可能会产生更多碎片,如果只是因为收缩会话之间的数据库添加。你拥有的会话越少,你可能就越好。
答案 1 :(得分:0)
请参阅以下链接,详细了解“为什么不应该缩小数据库或不要按缩小按钮”
http://www.sqlskills.com/BLOGS/PAUL/post/Why-you-should-not-shrink-your-data-files.aspx http://sqlinthewild.co.za/index.php/2007/09/08/shrinking-databases/
HTH, \ķ