如何从SQL Server数据库中删除未分配的空间?

我有一个最近收缩的数据库,当我运行sp_spaceused时,我看到它有500MB的未分配空间。 我试图保持这个数据库到一定的大小(做我的桌面用户的MSDE大小限制),我不知道未分配空间是否影响整体数据库大小。 有没有办法从数据库中删除这个未分配的空间?

对数据文件进行缩小处理时要非常小心,因为它使用的algorithm(我曾经在MS中拥有代码)导致索引碎片化。 我写的这篇博客文章包含一个示例脚本,显示我的意思是自动收缩 – closures它! 。 尽pipe博客文章标题是关于自动缩减的,但手动数据文件缩减使用的是SQL Server中完全相同的代码,因此也有相同的问题。

如果你只使用TRUNCATEONLY选项,Kyle说,你不会做任何数据移动,不会造成碎片。

如果数据库中有索引,则有两个选项:

  1. 之后运行收缩和删除索引碎片。 不要使用索引重build(因为它将需要再次增长数据库的空间为新的索引)。 使用我的旧DBCC INDEXDEFRAG或replaceALTER INDEX … REORGANIZE。 这只需要一个数据页面来操作,所以不会再增长数据库。
  2. 在数据库中创build另一个文件组,使用CREATE INDEX … WITH DROP_EXISTING语法将所有索引移动到其中,然后删除旧的文件组。

希望这可以帮助!

请参阅DBCC SHRINKFILE

SqlACID是正确的,特别是在TRUNCATEONLY或target_size

你为什么要缩小? 随着更多的数据被join,数据库往往会增长。 这是他们的本性。 数据文件中有未使用的空间没有任何问题。 实际上,SQL在文件中需要一些可用的空间。

收缩会导致大量的碎片化,只会在下次添加数据时导致数据文件再次增长。 当发生这种情况时,整个系统会随着文件的扩展而变慢(特别是如果你没有即时初始化的话)。 同样重复的收缩和增长会导致文件系统级别的碎片化,这很难修复。

如果我们看到巨大的未分配空间可以说150 GB左右,可能会想缩小。 我已经看到sp_spaceused说未分配高,但DBCC SHRINKFILE没有帮助的情况。 那么在这种情况下是否有必要或者必须强制使用目标方呢?