我在SQL Server 2005中有一个大表,占用大约3.5 GB的空间(根据sp_spaceused)。它有1000万条记录和几个索引。
我刚刚从它中删除了一堆列,这样记录长度减少了一半,令我惊讶的是它花了零时间来做到这一点。显然,sp_spaceused仍然报告相同的占用空间,SQL服务器在删除列时没有真正做任何事情,除了将它们标记为“已删除”。
因此,我将此表中的所有数据移动到另一个新表中,将其截断,并将所有数据移回,以便重新进行全部重构。
现在,在此之后,数据需要2.8 GB,比以前少,但我预计会有更大的下降。
这个表最初有这些列的事实是否仍然存在?
截断它不够吗?我应该放下它并使用较小的柱组再次创建吗?
或者数据确实占用2.8 GB?
谢谢!
答案 0 :(得分:4)
您需要重建聚簇索引(假设您有一个 - 默认情况下,您的主键是聚簇键)。
ALTER INDEX (your clustered index) ON TABLE (your table) REBUILD
数据实际上是聚集索引的叶级别 - 一旦重建它,它就会被“压缩”,行应该存储在更少的数据页上,这也会减少数据库的大小。
如果这根本没有帮助,您可能还需要在数据库上运行DBCC SHRINKDATABASE以真正回收空间。这两个步骤应该真的能为你提供一些较小的数据库文件!
马克
答案 1 :(得分:2)
你是如何计算出“预计会有更大的下降”?请注意,数据以8K页为单位,这意味着即使单个行较小,也并不总是意味着您需要更少的页面来存储它们。 例如(一个极端的例子),如果你的行每个都是7.5K,那么每页只有一行。你删除了一些列,你的行是5K,但每页仍然是一行。