2009-06-05 145 views
3

我在SQL Server 2005中有一个大表,占用大约3.5 GB的空间(根据sp_spaceused)。它有1000万条记录和几个索引。SQL Server 2005:删除列占用的磁盘空间

我刚把一帮来自于它的列,使得记录长度得到了降低到一半,让我吃惊花了零时间来做到这一点。显然,sp_spaceused仍报告相同的空间,SQL Server在删除列时没有做任何事情,除了将它们标记为“已删除”。

所以我搬到从这个表中的所有数据到另一个新表,截断它,感动了所有的数据备份,因此它会得到所有的重建。

现在,在这之后,数据正​​在2.8 GB,这是比以前少了,但我期待一个更大的下降。

有没有可能是事实,这台原本这些列仍留下的东西吗?

截断它不够?我是否应该放弃它并使用较小的色谱柱再次创建它?

或者数据真的是2.8 GB?

谢谢!

回答

2

你是怎么计算出“预计会有更大的下降”的?请注意,数据有8K页,这意味着即使单个行较小,这并不总意味着您需要较少的页面来存储它们。例如(一个极端的例子),如果你的行每次只有7.5K,每页只能有一行。你删除一些列,你的行是5K,但仍然是每页一行。

4

您将需要重建聚簇索引(假设你有一个 - 默认情况下,你的主键是聚集键)。

ALTER INDEX (your clustered index) ON TABLE (your table) REBUILD 

的数据是真的是你的聚集索引的叶级 - 当你重建它,这将是“压缩”和行应存放在少得多的数据页,减少数据库的大小了。

如果不能在所有帮助,你可能还需要你的数据库上运行DBCC SHRINKDATABASE真正回收空间。这两个步骤应该真的让你得到一些更小的数据库文件!

Marc

+0

而只是假设它是一个3.5GB的表,该操作将罚款与系统运行? – marquito 2013-04-02 17:30:08

相关问题