2011-02-15 54 views
6

我有一个表超过30万条记录,大小约1.5 GB回收未使用的空间在SQL Server 2008

在该表中我有三个varchar(5000)场,其余均为小型油田。

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

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

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

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

回答

3

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

如果表中有一个聚簇索引,只需重新索引它(ALTER INDEX ... REBUILD ...)就可以实现。

如果该表没有聚集索引,则可以创建一个然后删除它,或者SELECT ... INTO ...新表,删除旧表,然后将新表重命名为原始表名称。

+0

是的,“移动内容”是答案,更改聚集索引是一个很好的提示,我改变了数据库的结构(sql manager创建了一个drop并重新创建脚本...) – opensas 2011-02-16 00:41:03

0

我刚刚来设置这些字段为空,发出收缩,然后将它们设置为'

和DB 1.5 GB跑到115 MB

非常奇怪...

- 事实上

,设置这些字段可空手段 - 即重建整个表 - 没招

+0

不知道这里有没有什么区别,但是你的表是堆还是有聚簇索引? – 2011-02-15 23:41:38

2

只是因为你设置列为零并不意味着数据库将重新组织表格。更新后的记录仍然适合之前所适用的同一页面(页面上的可用空间量将增加)。

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

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

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

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

+0

yeap,我知道varchar是变量......这就是为什么我尽管清空varchar字段应该足以减少表的大小...... – opensas 2011-02-16 00:39:27