Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何从SQL Server表中删除未使用的空间?_Sql Server - Fatal编程技术网

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

Sql server 如何从SQL Server表中删除未使用的空间?,sql-server,Sql Server,我有一个SQL Server表,在nvarchar(max)列中有大量数据。我将该列的值设置为所有空值,因此现在该表不应占用太多空间。我怎样才能收回那个空间 我尝试了DBCC SHRINKDATABASE,也尝试了备份和恢复数据库,但空间似乎无法恢复。如果我删除该表并使用insert/select类型重新创建它,空间将被恢复 谢谢,我想您需要“从表或索引视图中删除的可变长度列中回收空间”。您需要的是并且应该像这样使用 DBCC CLEANTABLE (DB_NAME,"TABLE_NAME",

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

我尝试了
DBCC SHRINKDATABASE
,也尝试了备份和恢复数据库,但空间似乎无法恢复。如果我删除该表并使用insert/select类型重新创建它,空间将被恢复


谢谢,我想您需要“从表或索引视图中删除的可变长度列中回收空间”。

您需要的是并且应该像这样使用

DBCC CLEANTABLE (DB_NAME,"TABLE_NAME", 0)
WITH NO_INFOMSGS;
GO
引用MSDN文档中的警告

最佳做法

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

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

请看这篇文章,了解其背后的原因


在需要清理许多开发人员数据库时也有类似的问题

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

Alter table MyTable drop column MyColumn
DBCC CLEANTABLE(MyDB, MyTable, 0)
DBCC SHRINKDATABASE ('MyDB')
ALter table MyTable ADD MyColumn nvarchar(max) NULL
根据文件: 删除可变长度列后回收空间。
在创建大量未使用空间的操作(如截断表或删除表操作)之后,该操作最为有效。

一句话:不要-SQL Server将在将来的分配中重用该空间。在数据库时代,缩小数据库表和诸如此类的琐碎事情非常棒-不要再这样做了-在许多情况下,这是毫无意义的、无用的,实际上是适得其反的,而且它浪费CPU周期,可能会损害数据库。我试过DBCC CLEANTABLE,它很快就完成了,说成功了,但没有改变分配给表的空间。目前,占用的空间约为2GB,数据量仅为50MB左右。由于整个数据库只有大约150MB,因此只需等待另一个2GB的数据添加到数据库中(并顺其自然)是不切实际的。您如何确定所使用的空间?exec sp_spaceused“tablename”显示了什么?是否所有空间都未使用?从一行中的这3个屏幕截图可以看出,在运行cleantable之后,使用的空间是相同的。是否在sp_spaceused上尝试了updateusage参数?或者您是否也看到了文件系统中mdf所消耗的空间?抱歉,不知道,但语法是什么?exec sp_spaceused“EmailDetails”“True”