SQL Server 2005:已删除列占用的磁盘空间

时间:2009-06-05 19:55:19

标签: sql-server-2005 diskspace

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

我刚刚从它中删除了一堆列,这样记录长度减少了一半,令我惊讶的是它花了零时间来做到这一点。显然,sp_spaceused仍然报告相同的占用空间,SQL服务器在删除列时没有真正做任何事情,除了将它们标记为“已删除”。

因此,我将此表中的所有数据移动到另一个新表中,将其截断,并将所有数据移回,以便重新进行全部重构。

现在,在此之后,数据需要2.8 GB,比以前少,但我预计会有更大的下降。

这个表最初有这些列的事实是否仍然存在?

截断它不够吗?我应该放下它并使用较小的柱组再次创建吗?

或者数据确实占用2.8 GB?

谢谢!

2 个答案:

答案 0 :(得分:4)

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

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

数据实际上是聚集索引的叶级别 - 一旦重建它,它就会被“压缩”,行应该存储在更少的数据页上,这也会减少数据库的大小。

如果这根本没有帮助,您可能还需要在数据库上运行DBCC SHRINKDATABASE以真正回收空间。这两个步骤应该真的能为你提供一些较小的数据库文件!

马克

答案 1 :(得分:2)

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