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

Sea*_*wat 3 database sql-server

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

Pau*_*dal 8

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

如果您只使用 Kyle 所说的 TRUNCATEONLY 选项,您将不会进行任何数据移动,也不会导致碎片化。

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

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

希望这可以帮助!