在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测试了以下两个案例
- 改变列大小
- 创建新表并从旧表导入数据
在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指出这一点)
I好的经验法则是,仅当值可能超过8000字节时才使用MAX types,并为存储的数据域指定一个适当的最大长度,以使数据不超过8000字节。Hmm可能重复。。。但它并没有回答我关于它的优点和缺点的问题。我要求的是space.are等效,因为它们只占用内容的空间。当大值存储在单独的LOB页中时,主mage包含一个指向行外数据第一页的24字节指针。然后根据需要将这些8K LOB页面链接到2GB。看见