在很大程度上减少表空间使用的实验性尝试中,我将一char(10)
列更改为char(3)
(该列的内容永远不会超过三个字符长)
步骤(不分批进行)
use thedatabase;
alter table thetable
alter column thecolumn char(3) null
DBCC CLEANTABLE (thedatabase,'thetable', 500000);
/* Apparently not needed for fixed length column but just in case*/
DBCC SHRINKFILE (1);
操作成功完成,但表的大小实际上增加了。我知道这可能是由于 sql 引擎修改列的方式(创建一个副本然后复制列内容)所以我dbcc cleantable
在表上运行,然后dbcc shrinkfile
在数据库文件上运行。这些操作都不会对表大小产生任何影响。
该表没有索引,因此无法运行重建索引操作。
所以我的问题是,为什么桌子变大了,即使在命令缩小它之后也是如此。
这很可能与转发的记录有关,新的 char(3) 值被复制到一个新的分配单元(页面),并在其位置留下一个转发指针。您可以检查它们是否存在。
由于您使用的是 SQL Server 2005,解决此问题的唯一方法是在表上创建聚集索引,然后删除它。SQL 2008 将允许您这样做
ALTER TABLE <TABLE> REBUILD
。DBCC CLEANTABLE
varchar
仅清除类型为and的可变长度列nvarchar
,请参阅: Steve Stedman 的DBCC CleanTable。