考虑我的专栏VARCHAR(MAX)
。如果我将其更改为VARCHAR(500)
,Microsoft SQL Server将减少表格所声明的大小,该怎么办?
如果你有任何链接只是评论它。我会检查一下。
我已经用表格测试了两个案例。
初始表格尺寸
ALTER TABLE table_transaction ALTER COLUMN column_name VARCHAR(500)
在ALTER列之后,表格大小会增加
使用新列大小创建新表并从旧表导入数据
我已经在新表中处理了索引。
为什么在ALTER COLUMN
的情况下会增加表格大小。理想情况下,表格大小应减少。
在原始表格中对PK
执行去碎片化后,几个MB减少了。然而,它不像创建新表那样有希望。
答案 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
,则根本不会有任何更改。这些值未存储。