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

时间:2015-01-31 11:23:59

标签: sql sql-server

考虑我的专栏VARCHAR(MAX)。如果我将其更改为VARCHAR(500),Microsoft SQL Server将减少表格所声明的大小,该怎么办?

如果你有任何链接只是评论它。我会检查一下。

更新

我已经用表格测试了两个案例。

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

初始表格尺寸

enter image description here

ALTER TABLE table_transaction ALTER COLUMN column_name VARCHAR(500)
在ALTER列之后,表格大小会增加 enter image description here

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

enter image description here

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

在原始表格中对PK执行去碎片化后,几个MB减少了。然而,它不像创建新表那样有希望。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

  

varchar [(n | max)]

     

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

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

我对此持怀疑态度。我希望varchar(max)的长度占用四个字节。存储页外引用可能存在额外的开销(如果存在)。但是,文档在这一点上非常明确。

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

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