我有一张包含超过300,000条记录的表,大小约为1.5 GB
在该表格中,我有三个varchar(5000)
字段,其余为小字段。
在发出update
时,将这三个字段设置为''
。
收缩(数据库和文件)后,数据库使用的空间几乎与以前相同......
DBCC SHRINKDATABASE(N'DataBase' )
DBCC SHRINKFILE (N'DataBase' , 1757)
DBCC SHRINKFILE (N'DataBase_log' , 344)
关于如何回收磁盘空间的任何想法?
答案 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
很奇怪......-
实际上,将这些字段设置为可空 - 这意味着重新创建整个表格 - 这就是诀窍