我有一个SQL Server表,其nvarchar(max)
列中包含大量数据。我将列值设置为所有空值,所以现在表不应占用太多空间。我怎样才能收回那个空间?
我已经尝试了DBCC SHRINKDATABASE
,我也尝试过备份和恢复数据库,但空间似乎无法恢复。如果我删除表并使用插入/选择类型的东西重新创建它,则空间将被恢复。
感谢
答案 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)
列时,它将再次使用该空间。所以,基本上你不会从中获得任何好处。
看一下这篇文章,了解相同的
背后的推理答案 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操作在创建大量未使用空间的操作后最有效,例如截断表或删除表操作。