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

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

我有一个最近缩减的数据库,当我运行 sp_spaceused 时,我发现它有 500MB 的未分配空间。我试图将此数据库保持在一定大小(因为我的桌面用户有 MSDE 大小限制),但我不确定未分配空间是否会影响整个数据库大小。有没有办法从数据库中删除这个未分配空间?

答案1

运行数据文件收缩时要非常小心,因为它使用的算法会导致索引碎片化(我在 MS 时曾拥有该代码)。我写的这篇博客文章包含一个示例脚本,说明了我的意思。自动收缩——关闭它!。虽然博客文章的标题是关于自动收缩的,但手动数据文件收缩在 SQL Server 中使用完全相同的代码,因此存在同样的问题。

如果您仅使用 Kyle 所说的 TRUNCATEONLY 选项,那么您将不会进行任何数据移动,也不会造成碎片。

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

  1. 运行收缩并随后删除索引碎片。但不要使用索引重建来执行此操作(因为它需要再次扩大数据库以腾出空间用于新索引)。使用我的旧 DBCC INDEXDEFRAG 或它的替代品 ALTER INDEX ... REORGANIZE。这只需要一个数据页即可操作,因此不会再次扩大数据库。
  2. 在数据库中创建另一个文件组,使用 CREATE INDEX ... WITH DROP_EXISTING 语法将所有索引移动到其中,然后删除旧文件组。

希望这可以帮助!

答案2

答案3

SqlACID 是正确的,具体查看 TRUNCATEONLY 或 target_size

答案4

如果我们看到巨大的未分配空间,比如说 150 GB 左右,我们可能需要缩小空间。我曾见过一个案例,其中 sp_spaceused 显示未分配空间很高,但 DBCC SHRINKFILE 没有帮助。那么在这种情况下,是否有必要或必须说必须使用目标端

相关内容