SQL Server varchar(50)和varchar(128)性能差异

时间:2012-07-16 07:21:57

标签: sql sql-server

  

可能重复:
  is there an advantage to varchar(500) over varchar(8000)?

我目前正在开发一个包含varchar(50)列的表。我们现在必须在一些列中插入的数据超过50个字符,因此我们必须将列大小从50更改为128这些列,因为我们有很多列,浪费时间来更改单个列。

所以我向我的团队提出,为什么我们不把所有列都改为varchar(128)。一些队友认为,这会在选择和加入操作期间造成性能损失。

现在我不是数据库方面的专家,但我不认为从varchar 50迁移到varchar 128会导致任何重大的性能损失。

P.S - 我们在这些专栏中没有任何姓名,地址类型的数据。

4 个答案:

答案 0 :(得分:4)

从每个角度来看,

varchar(50)varchar(128)的行为几乎完全相同。 50个字符以下的值的存储大小相同。它们可以互换地加入(varchar(50)加入varchar(128))w / o类型转换问题(即varchar(50)上的索引可以在联接中寻找列varchar(128))和同样适用于WHERE谓词。在SQL Server 2012之前,增加varchar列的大小是一个非常快速的元数据操作,在SQL Server 2012之后,此操作可能是一个缓慢的数据更新大小 - 在某些条件下的每次记录操作,类似于Adding a nullable column can update the entire table中描述的操作。

任何列长度更改都可能产生一些问题:

  • 处理意外尺寸值的应用程序问题。如果不正确地编码(即,较大的大小可能导致缓冲区溢出),本机的可能会遇到缓冲区大小问题。托管应用程序不太可能出现严重问题,但可能会出现诸如屏幕上或报告中的列宽不适合的小问题。
  • 在插入或更新时截断值的T-SQL错误
  • 发生T-SQL静默截断并导致值不正确(例如,@variables在存储过程中声明为varchar(50)
  • 可能会达到最大行大小或最大索引大小等限制。例如。今天你有一个8列varchar(50)列的复合索引,扩展到varchar(128)将超过最大索引大小900并触发警告。

马丁关于记忆补助的警告是一个非常有效的问题。我会购买更多内存,如果这确实是一个问题。

答案 1 :(得分:3)

答案 2 :(得分:0)

这样的列数是多少?最佳实践规则表明您需要仔细规划每个列并相应地定义大小。您应该识别适合varchar(128)的列,而不是盲目地增加所有列的大小。

答案 3 :(得分:0)

我建议只更改需要更改的列。如果任何列中不需要超过50个字符,请不要更改。

为什么你要为所有列的长度设置相同?我怀疑所有列都有相同的长度要求。