SQL中减小的行大小并没有减小表大小

时间:2011-04-04 08:56:04

标签: sql-server sql-server-2005

有人可以解释我在SQL Server 2005中看到的一些行为吗?

我的任务是减小尺寸或我们的数据库。

该表包含近600万条记录,我将行大小计算为1990字节。我拿了一份表的副本,并通过各种技术将行大小减少到803字节。

当我将原始表的数据大小(右键单击属性或sp_spaceused)与新表进行比较时,我看到只保存了21.7 MB。这远远不是我所期待的。

以下是我计算行大小的方法: 如果列是数字/十进制,那么我使用MSDN大小(http://msdn.microsoft.com/en-us/library/ms187746.aspx),对于我使用syscolumns.length的其他所有内容。如果列可以为空,我添加了一个额外的字节。

以下是我实施的一些更改。

  1. 将不必要的nvarchars变成varchars
  2. 制作列NOT NULL
  3. 减少varchar列的最大长度以适应实际数据
  4. 删除了一些未使用的列
  5. 将datetime成为smalldatetime
  6. 将一些小数转换为整数。
  7. 将16个可以为空的BIT列合并为一个掩码为int的行。
  8. 从这一点来看,我的计算显示行减少了60%,而对于6M行表,我预计会节省超过21MB。它从2,762,536 KB下降到2,740,816 KB。

    有人可以向我解释一下这种行为吗?

    P.S。这没有考虑任何索引。

2 个答案:

答案 0 :(得分:3)

问题是更改表格不会回收任何空间。删除列只是合乎逻辑的,列是隐藏,而不是删除。修改列类型通常会导致添加新列并隐藏前一列。所有这些操作增加表的物理大小。要回收'真实'空间,您需要重建表格。使用SQL 2008及更高版本,您将发出ALTER TABLE ... REBUILD。在SQL 2005中,您可以发出DBCC REINDEX(table)

答案 1 :(得分:0)

我认为您需要在表上重建聚集索引。