在SQL Server 2008中回收未使用的空间

时间:2011-02-15 23:20:24

标签: sql-server-2008 administration

我有一张包含超过300,000条记录的表,大小约为1.5 GB

在该表格中,我有三个varchar(5000)字段,其余为小字段。

在发出update时,将这三个字段设置为''

收缩(数据库和文件)后,数据库使用的空间几乎与以前相同......

DBCC SHRINKDATABASE(N'DataBase' )
DBCC SHRINKFILE (N'DataBase' , 1757)
DBCC SHRINKFILE (N'DataBase_log' , 344)

关于如何回收磁盘空间的任何想法?

3 个答案:

答案 0 :(得分:3)

基本上,您必须将表格内容从硬盘驱动器上的一个位置“移动”到另一个位置。当这样移动时,SQL将有效地“重新打包”页面的内容。用3(或0和翻转的空位掩码)替换5000字节的数据不会导致SQL修改或重写表页面的内容。

如果表格有聚集索引,只需重新索引它(ALTER INDEX ... REBUILD ...)即可。

如果表没有聚簇索引,您可以创建一个然后删除它,或者选择SELECT ... INTO ...一个新表,删除旧表,并将新表重命名为原始名称

答案 1 :(得分:2)

仅仅因为您将列设置为nil并不意味着数据库将重组该表。更新的记录仍然适合之前适合的页面(页面上的可用空间量将增加)。

另外,你知道,不是吗,varchar(5000)并不意味着它需要5000个八位字节?它是可变长度 - 一个两个八位字节长度的前缀,包含字段的数据长度,后跟数据八位字节。将行中的varchar(5000)列设置为'foobar'将需要8个八位字节的空间(2 + 6)。

重建您的索引,包括聚类索引。

如果您没有聚类索引,请添加一个。这将迫使表重组。现在删除聚类索引。

现在缩小数据文件时,应该回收一些磁盘空间。

答案 2 :(得分:0)

我只需将这些字段设置为null,发出缩小,然后将它们设置为''

并且db从1.5 GB变为115 MB

很奇怪......

-

实际上,将这些字段设置为可空 - 这意味着重新创建整个表格 - 这就是诀窍