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

时间:2017-05-12 20:01:53

标签: sql .net sql-server

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

但是,对于这种情况,我们是否应始终使用nvarchar(max)?还是分配500个字符更好?

我问,因为我搜索了一下,我看到有人说nvarchar(max)为该列保留了大量内存,最终可能会降低数据库的性能。

编辑:很棒的答案,我现在对这个话题很清楚。没有unicode的东西,因此我要去varchar(600)

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分: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 : Bad Habits and Best Practices - Aaron Bertrand

参考:

答案 2 :(得分:1)

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

如果你只有简单的ASCII,那么varchar()是合适的,但nvarchar()几乎不会造成伤害。

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

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