sql-server - SQL 中减少行大小并没有减少表大小

标签 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. 将不必要的 nvarchar 转换为 varchar
  2. 使列不为空
  3. 减少了 varchar 列的最大长度以适应实际数据
  4. 删除了一些未使用的列
  5. 将几个日期时间转换为smalldatetime
  6. 将一些小数转换为整数。
  7. 将 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/

相关文章:

sql - 当分区更改时,对记录进行分组并以奇数开始行号

sql - 将一个数据库的表替换为另一个数据库的表

mysql - Rails 服务器可以工作...但无法生成脚手架

sql-server - 处理许多删除语句的更好方法

sql - 总和列以显示每一行的总数

sql - 使用 group by 检索主键上的聚合行

sql-server - SQL Server 查询/函数四舍五入到一半

sql-server - 如何确定插入时哪一列引发算术溢出错误?

sql - 用介于 2 个日期参数之间(包括 2 个日期参数)的日期填充临时表的最简单方法

sql-server - 索引 View 中的 SQL Server ISDATE