【问题标题】:Impact of altering table column size/length in SQL Server在 SQL Server 中更改表列大小/长度的影响
【发布时间】:2015-01-31 11:23:59
【问题描述】:

考虑一下我的专栏VARCHAR(MAX)。如果我将其更改为VARCHAR(500),Microsoft SQL Server 会减小 table 声明的大小吗?

如果您有任何链接,请发表评论。我去看看。

更新:

我用表格测试了以下两种情况。

  • 改变列大小
  • 创建新表并从旧表中导入数据。

初始表格大小

ALTER TABLE table_transaction ALTER COLUMN column_name VARCHAR(500)
在 ALTER 列之后,表大小增加

使用新的列大小创建新表并从旧表中导入数据
我已经处理了新表中的索引。

为什么在ALTER COLUMN 的情况下会增加表大小。理想情况下,表大小应该减小。

在对原始表中的PK 执行碎片整理后,减少了几 MB。但是它不像创建新表那样有前途。

【问题讨论】:

标签: sql sql-server


【解决方案1】:

当您将 varchar(n) 列更改为 varchar(MAX) 或反之亦然时,SQL Server 将更新表中的每一行。这将暂时增加表大小,直到您重建聚集索引或执行 DBCC CLEANTABLE。

对于 varchar(MAX) 列的持续空间要求,只要值保持在行内,空间将与 varchar(n) 相同。但是,如果值超过 8000 字节,它将存储在专用于该值的单独 LOB 页上。当查询需要该值时,这将增加空间需求并需要额外的 I/O。

我的经验法则是仅当值可能超过 8000 字节时才使用 MAX 类型,并为存储的数据域指定适当的最大长度(用于 8000 字节或更少字节)。

【讨论】:

    【解决方案2】:

    根据documentation,字符串的存储没有区别:

    varchar [ ( n | max ) ]

    可变长度、非 Unicode 字符串数据。 n 定义字符串长度 并且可以是 1 到 8,000 之间的值。最大值表示 最大存储大小为 2^31-1 字节 (2 GB)。存储大小为 输入数据的实际长度 + 2 个字节。

    在我阅读本文时,无论您使用n 还是max,存储大小都是实际长度加上两个字节。

    我对此表示怀疑。我希望varchar(max) 的长度占用四个字节。并且存储页外引用(如果存在)可能会有额外的开销。但是,文档在这一点上非常清楚。

    改变数据类型是否改变字段的大小取决于已经存储的数据。你可以有几种情况。

    • 如果所有值都是NULL,那么根本不会有任何变化。没有存储这些值。
    • 如果所有值都小于 20 字节,那么——根据文档——不会有任何变化。我怀疑您可能会为每个值节省 2 个字节,但我找不到对它的引用,而且今天没有 SQL Server 可供检查。
    • 如果值超过 20 个字节但仍保留在页面上,那么您将节省空间,因为值会发生变化。
    • 如果值离开页面,那么您将保存标题信息并截断数据(感谢 Dan 指出这一点)。

    【讨论】:

    猜你喜欢
    • 2012-04-25
    • 1970-01-01
    • 2012-03-01
    • 2021-12-06
    • 2010-12-25
    • 2022-08-19
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    相关资源
    最近更新 更多