我必须缩小大约的数据库。1TB 降至 700GB 左右(在不扩展的情况下留下 200+ Gb 用于增长)。我有一个脚本,它将按设定的增量(例如 1GB)循环和缩小数据库。这在您必须随时中止的情况下非常有用,因为进度不会丢失,总收缩操作可能会运行 4-5 天。问题是,以增量方式缩小数据库文件与一次性(执行一个 dbcc 缩小文件)相比是否会导致更多碎片?谢谢!!
2 回答
(这是基于 MS SQL Server。您的里程可能会因其他 RDBMS 而异。)
如果所有其他条件都相同,我怀疑您不会因错误地分割您的缩小过程而导致更大的碎片化。当文件被收缩时,SQL 可能不得不在内部移动数据,从将被删除的页面到不会被删除的空页面。如果块 A、B 和 C 被移动到 X、Y 和 Z,然后从数据库文件中删除,那么分三步执行会产生与分三步执行一样多的碎片。
我看到的问题是,如果您首先“缩小”块 A,然后在开始处理块 B 之前,加载了更多数据,导致数据库将数据存储在块 D 中——该部分之前是空的,以最终收缩为目标?更糟糕的是,如果添加新数据需要重新创建块 A,那么您将不得不再次缩小块 A 怎么办?
这是描述我只知道外观的东西的高级尝试。我怀疑多次收缩可能会产生更多的碎片,如果只是因为收缩会话之间的数据库添加。你拥有的会话越少,你可能就越好。
请参阅下面的链接以获取有关“为什么不应该缩小数据库或不按缩小按钮”的更多详细信息
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/收缩数据库/
HTH, \K