在SQL Server中更改表列大小/长度的影响

在SQL Server中更改表列大小/长度的影响,sql,sql-server,Sql,Sql Server,假设我有一列VARCHAR(MAX)。如果我将其更改为VARCHAR(500),Microsoft SQL Server会减少表中声明的大小吗 如果你有任何链接,请发表评论。我去看看 更新: 我用table测试了以下两个案例 改变列大小 创建新表并从旧表导入数据 初始表格大小 更改表\u事务更改列\u名称VARCHAR(500) 在ALTER列之后,表大小将增加 使用新列大小创建新表,并从旧表导入数据 我已经处理了新表中的索引 为什么在ALTER COLUMN的情况下增加表的大小。理想

假设我有一列
VARCHAR(MAX)
。如果我将其更改为
VARCHAR(500)
,Microsoft SQL Server会减少表中声明的大小吗

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

更新: 我用table测试了以下两个案例

  • 改变列大小
  • 创建新表并从旧表导入数据
初始表格大小

更改表\u事务更改列\u名称VARCHAR(500)
在ALTER列之后,表大小将增加

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

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

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

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

varchar[(n|max)]

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

当我读到这篇文章时,存储大小是实际长度加上两个字节,而不管您是使用
n
还是
max

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

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

  • 如果所有值均为
    NULL
    ,则不会有任何更改。未存储这些值
  • 如果所有的值都小于20字节,那么——根据文档——就不会有任何变化。我一直怀疑每个值可能会节省2个字节,但我找不到它的引用,而且今天手头没有SQL Server可供检查
  • 如果值超过20个字节,但仍保留在页面上,那么您将节省空间,因为值将更改
  • 如果值离开页面,那么您将保存标题信息以及截断数据(感谢Dan指出这一点)
当您将varchar(n)列更改为varchar(MAX)或反之亦然时,SQL Server将更新表中的每一行。这将暂时增加表大小,直到重新生成聚集索引或执行DBCC CLEANTABLE

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


I好的经验法则是,仅当值可能超过8000字节时才使用MAX types,并为存储的数据域指定一个适当的最大长度,以使数据不超过8000字节。

Hmm可能重复。。。但它并没有回答我关于它的优点和缺点的问题。我要求的是space.are等效,因为它们只占用内容的空间。当大值存储在单独的LOB页中时,主mage包含一个指向行外数据第一页的24字节指针。然后根据需要将这些8K LOB页面链接到2GB。看见