如何从SQL Server表中删除未使用的空间?

时间:2014-04-14 16:35:01

标签: sql-server

我有一个SQL Server表,其nvarchar(max)列中包含大量数据。我将列值设置为所有空值,所以现在表不应占用太多空间。我怎样才能收回那个空间?

我已经尝试了DBCC SHRINKDATABASE,我也尝试过备份和恢复数据库,但空间似乎无法恢复。如果我删除表并使用插入/选择类型的东西重新创建它,则空间将被恢复。

感谢

3 个答案:

答案 0 :(得分:1)

我认为您需要DBCC CLEANTABLE,"从表格或索引视图中删除的可变长度列中回收空间。"

答案 1 :(得分:1)

您要找的是DBCC CLEANTABLE,应该像

一样使用
DBCC CLEANTABLE (DB_NAME,"TABLE_NAME", 0)
WITH NO_INFOMSGS;
GO

来自MSDN文档的警告引用

  

最佳实践

     

DBCC CLEANTABLE不应作为例行维护任务执行。   相反,在对其进行重大更改后使用DBCC CLEANTABLE   您需要在表或索引视图中使用可变长度列   立即回收未使用的空间。或者,您可以重建   表或视图上的索引;然而,这样做更多   资源密集型运营。

正如马克已经提到的那样,你应该避免这样做。这不是必需的,因为下次将数据插入到nvarchar(max)列时,它将再次使用该空间。所以,基本上你不会从中获得任何好处。

看一下这篇文章,了解相同的

背后的推理

reclaim-the-unused-space-from-sql-server-2005-database

答案 2 :(得分:0)

有类似的问题,需要清理一些DEV数据库时。

对我有用的最好方法是首先删除列,然后运行干净的表,然后收缩数据库。最后重新创建专栏。

Alter table MyTable drop column MyColumn
DBCC CLEANTABLE(MyDB, MyTable, 0)
DBCC SHRINKDATABASE ('MyDB')
ALter table MyTable ADD MyColumn nvarchar(max) NULL

根据文件: 删除可变长度列后,CLEANTABLE将回收空间。 SHRINKDATABASE操作在创建大量未使用空间的操作后最有效,例如截断表或删除表操作。