gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:29:59 25 4
gpt4 key购买 nike

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

我的任务是减少大小或我们的数据库。

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

当我将原始表的数据大小(右键单击属性或 sp_spaceused)与新表进行比较时,我发现仅节省了 21.7 MB。这与我的预期相差甚远。

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

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

  • 将不必要的 nvarchars 转换为 varchars
  • 使列不为空
  • 减少 varchar 列的最大长度以适应实际数据
  • 删除了一些未使用的列
  • 将一对日期时间转换为小日期时间
  • 将一些小数变成整数。
  • 将 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com