SQL Server的良好实践:nvarchar(max)性能

Mar*_*nni 9 .net sql sql-server

新的.net程序员在这里.作为一名新的程序员,我总是尽力遵循工作时的最佳实践.今天我开始使用SQL Server,并询问同事应该将哪种数据类型用于用户描述列.他告诉我使用nvarchar(MAX),我做了,效果很好.

但是,我们应该总是使用nvarchar(max)这种情况吗?还是分配500个字符更好?

我问,因为我google了一点点,我看到人们说这nvarchar(max)为列保留了大量内存,这最终可能会降低数据库的性能.

编辑:很棒的答案家伙,我现在清楚这个话题.没有unicode的东西,所以我要去varchar(600)

SMo*_*Mor 9

最佳做法是在设计表格之前执行适当的数据分析.没有上下文,可以假设的描述并没有包含的页面和文字的页面,所以"最大"的选择可能是不恰当的.作为选择varchar(max)时的另一个考虑因素,请记住您通常需要为在应用程序中显示此类值提供支持.如果您不打算设计GUI来执行此操作,那么选择可能不合适.

还有一点需要注意 - 通过选择超出可预见需求的数据类型来尝试面向未来的架构通常是徒劳的.


Gor*_*off 5

nvarchar(max)只要您的字段可能包含国家字符(非简单 ASCII)并且长度可能超过 8,000 字节,您就应该使用该字段。在这种情况下,这是完全正确的事情。

如果您只有简单的 ASCII,那么varchar()就比较合适,但nvarchar()危害不大。

如果您的字段具有已知的最大长度或合理的最大长度,则max不合适。所以stateName varchar(32)(或者其他什么),不是stateName varchar(max)。或productDescription nvarchar(255)productDescription nvarchar(max)

如果描述很长,请随意使用。但不要过度使用它。

  • 限制是 8,000 个字节而不是字符。所以 4,000 个双字节字符。 (8认同)

Sql*_*Zim 5

除了无法使用LOB数据类型执行在线索引重建之外,选择nvarchar(max)而不是nvarchar(4000)或将会有性能损失nvarchar(1000).

SQL Server将假设平均值将是最大大小的一半,这直接影响SQL Server将为查询授予的内存.

Aaron Bertrand在本演示文稿/成绩单中解释了这一点以及演示:

因此,当SQL Server查看某个列并且你已经决定,"哦,我们只需要使用这个nvarchar 4000,以便我们覆盖以防万一."SQL Server实际上认为平均值将包含2000个字符.所以,当你有varchar 4000并且它的超大尺寸并且所有值都是10个字符时你实际上是SQL Server将授予此查询的内存是每行2000个字节,仅用于该列,而不是10个字节真的需要它.因此,您可以看到授权的KB如何随着时间的推移而上升,以及它实际上如何影响已用时间.
- GroupBy.org - T-SQL:糟糕的习惯和最佳实践 - Aaron Bertrand

参考: