SQL Server VARCHAR 列宽

Eri*_* J. 15 sql-server-2008 sql-server varchar

在网上搜索,我发现在指定过宽的 VARCHAR 列时是否会影响性能的建议相互矛盾,例如 VARCHAR(255) 时 VARCHAR(30) 可能会这样做。

我一致认为,如果整行超过 8060 字节,性能会受到影响。除此之外,我看到了分歧。

索赔是真的The default is SET ANSI PADDING ON = potential for lots of trailing spaces吗?只要总行宽小于 8060,过大的 VARCHAR 列是否有任何真正的性能问题?

列宽很重要的证据


The same goes for CHAR and VARCHAR data types. Don’t specify more characters in character columns that you need.

http://www.sql-server-performance.com/2007/datatypes/


  • Length is a constraint on the data (like CHECK, FK, NULL etc)
  • Performance when the row exceeds 8060 bytes
  • Can not have unique constraint or index (key column width must be < 900)
  • The default is SET ANSI PADDING ON = potential for lots of trailing spaces

设置 varchar(8000) 的后果是什么?


列宽无关紧要的证据


If you're talking about varchar and nvarchar then no, there is no penalty for allowing a higher field length.

/sf/ask/491819751/


The varchar datatype, by contrast, consumes only the amount of actual space used plus 2 bytes for overhead

http://sqlfool.com/content/PerformanceConsiderationsOfDataTypes.pdf


Pau*_*ite 8

这个问题可能更好地表述为:

“过度指定可变长度列的最大长度有什么好处?”

一般来说,正如各种链接的答案所指出的那样,几乎没有优势,并且有几个缺点。除了任何其他问题,请考虑 SQL Server 不是开源的:根据提供给系统的信息应用了许多“幻数”和启发式方法。如果没有源代码访问权限,我们永远无法完全确定这种做法可能产生的影响。

某些情况下,当计算排序/散列内存授权时,列的平均长度明显高于 SQL Server 假定的 50%,您可能会发现通过过度指定最大长度来提高性能。这是一个可疑的解决方法,可能只应由显式CASTCONVERT(带有注释!)而不是更改基本列定义来应用。有时,最好重写查询以对键进行排序,而不是对整行进行排序

在最大行大小可能超过行内限制的情况下(即使实际上没有行),如果存在触发器,删除行可能会导致意外的页面拆分。更新也可能通过相同的机制导致碎片化。

SQL Server 在大多数情况下都做得很好,因为它提供了来自元数据的良好、准确的信息。为了“方便”而妥协这一原则在我看来是不明智的。明智的做法是根据要存储的实际数据以及任何可预见的变化,选择合理的最大长度值。