【问题标题】:Good practices of SQL Server: nvarchar(max) performanceSQL Server 的良好实践:nvarchar(max) 性能
【发布时间】:2017-10-12 05:46:37
【问题描述】:

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

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

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

编辑:很棒的答案伙计们,我现在很清楚这个话题。没有 unicode 的东西,因此我会选择 varchar(600)

【问题讨论】:

  • 描述可以超过 4,000 个字符吗? UI 可以显示多少或强制执行最大长度是否有任何限制?您希望最多允许 2GB 条目吗?
  • 关于 varchar(max) 需要考虑的一点是它有一些缺点,例如不能索引 varchar(MAX),尽管可以索引 varchar(N)。此外,带有 varchar(MAX) 的表不能使用新的 ColumnStore 索引类型,这对于报告服务器等很有用。 stackoverflow.com/questions/7141402/why-not-use-varcharmax
  • @MartinSmith 我在考虑最多 600-800 个字符。
  • 那么不要使用max。它们比非最大数据类型效率低,并且有更多限制。仅当您确实需要额外长度时才应使用它们。
  • 很棒的答案伙计们,我现在很清楚这个话题了。没有 unicode 的东西,因此我会选择 varchar(600)

标签: sql .net sql-server


【解决方案1】:

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

还有一个警告 - 通过选择超出您可预见需求的数据类型来尝试使您的架构适应未来通常是徒劳的。

【讨论】:

  • 谢谢!在这种情况下,该字段将允许用户设置关于他或她的工作资料的描述。我在考虑最多 600 个字符。
  • @MarianoGianni 是的。这些是编辑决定,而不是技术决定。您可能还想限制行数等。例如,像 SO 一样,在超出限制时提供适当的反馈和编辑功能。
  • 这不是你是否应该限制它的问题,而是在哪里限制它。您是否希望数据库在一定大小限制后给出异常是问题。在实践中,对于存储面向文本的大型文档,我从不后悔 max。我曾多次后悔低于max。讨厌打破 YAGNI 泡沫,但假装问题没有发生,故意短视并不是一个好的生活策略。
【解决方案2】:

除了无法为使用 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

参考:

【讨论】:

【解决方案3】:

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

如果你只有简单的 ASCII,那么varchar() 是合适的,但nvarchar() 没有什么害处。

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

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

【讨论】:

  • 限制是 8,000 字节而不是字符。所以 4,000 个双字节字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2010-09-08
  • 2018-05-22
  • 1970-01-01
相关资源
最近更新 更多