有人可以解释一下我在 SQL Server 2005 中看到的一些行为吗?
我的任务是缩小数据库的大小。
该表包含近 600 万条记录,我计算出行大小为 1990 字节。我复制了该表,并通过各种技术将行大小减少到 803 字节。
当我将原始表的数据大小(右键单击属性或 sp_spaceused)与新表进行比较时,我发现仅节省了 21.7 MB。这与我的预期相去甚远。
这是我计算行大小的方法: 如果列是数字/小数,那么我使用 MSDN 大小 (http://msdn.microsoft.com/en-us/library/ms187746.aspx),对于其他所有内容,我使用 syscolumns.length。如果该列可为空,我会添加一个额外的字节。
以下是我实现的一些更改。
- 将不必要的 nvarchar 转换为 varchar
- 使列不为空
- 减少了 varchar 列的最大长度以适应实际数据
- 删除了一些未使用的列
- 将几个日期时间转换为smalldatetime
- 将一些小数转换为整数。
- 将 16 个可为空的 BIT 列合并为一个位掩码 int。
据此,我的计算显示行大小减少了 60%,对于 6M 行表,我预计可以节省超过 21MB。它从 2,762,536 KB 减少到 2,740,816 KB。
有人可以向我解释一下这种行为吗?
附:这没有考虑任何索引。
最佳答案
问题是更改表不会回收任何空间。删除列只是逻辑上的,该列是隐藏的,而不是删除的。修改列类型通常会导致添加新列并隐藏前一列。所有这些操作都会增加表的物理大小。要“真正”回收空间,您需要重建表。对于 SQL 2008 及更高版本,您将发出 ALTER TABLE ... REBUILD
。在 SQL 2005 中,您可以发出 DBCC REINDEX(table)
。
关于sql-server - SQL 中减少行大小并没有减少表大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5536391/