【问题标题】:SQL performance: Is there any performance hit using NVarchar(MAX) instead of NVarChar(200)SQL 性能:使用 NVarchar(MAX) 代替 NVarChar(200) 是否有任何性能影响
【发布时间】:2011-05-21 16:44:22
【问题描述】:

我想知道定义一个 nvarchar(max) 类型的列而不是给它一个(较小的)最大大小是否有任何缺点。

我在某处读到,如果列值超过 4?KB,则剩余数据将添加到“溢出”区域,这没关系。

我正在创建一个表格,其中大部分时间文本只有几行,但我想知道设置下限然后添加验证以避免突破该限制是否有任何优势。

对使用 nvarchar(max) 列创建索引是否有任何限制,或者有什么需要支付对大小限制的限制?

谢谢!

【问题讨论】:

    标签: sql-server performance indexing nvarchar


    【解决方案1】:

    严格来说,MAX 类型总是比非 MAX 类型慢一点,请参阅Performance comparison of varchar(max) vs. varchar(N)。但这种差异在实践中永远看不到,它只是在 IO 驱动的整体性能中变成了噪音。

    您主要关心的不应该是 MAX 与非 MAX 的性能。您应该关心的问题此列可能必须存储超过 8000 个字节?如果答案是肯定的,即使是非常不可能的,那么答案是很明显:使用 MAX 类型,稍后将此列转换为 MAX 类型的痛苦不值得非 MAX 类型的微小性能优势。

    Denis 的回答已经解决了其他问题(索引该列的可能性、对具有 MAX 列的表的 ONLINE 索引操作不可用)。

    顺便说一句,关于超过 4KB 的列在溢出区域中有剩余数据的信息是错误的。正确信息在Table and Index Organization

    ROW_OVERFLOW_DATA 分配单元

    对于表使用的每个分区 (堆或聚簇表)、索引或 索引视图,有一个 ROW_OVERFLOW_DATA 分配单元。 此分配单元包含零 (0) 页直到具有变量的数据行 长度列(varchar、nvarchar、 varbinary 或 sql_variant) 在 IN_ROW_DATA 分配单元超过 8 KB 行大小限制。当大小 达到限制,SQL Server 移动最大的列 从该行到页面的宽度 ROW_OVERFLOW_DATA 分配单元。一种 指向此行外数据的 24 字节指针 保留在原始页面上。

    所以不是超过 4KB 的列,是不适合页面上可用空间的行,不是“剩余”,是整个列。

    【讨论】:

    • "SQL 2012:您不能在分区级别进行在线索引重建。但是,您可以对除 text、ntext、image 之外的所有数据类型的整个索引进行在线索引重建。这意味着具有 varchar(max)、nvarchar(max) 和 varbinary(max) 列的表可以在 SQL 2012 中在线重建。SQL 2014:您可以在分区级别进行在线索引重建。您可以对 varchar(max) 进行在线索引重建)、nvarchar(max) 和 varbinary(max) 数据类型。就像 SQL 2012 一样,不包括 text、ntext、image。这些是真正应该随着时间推移逐步淘汰的遗留数据类型。"
    【解决方案2】:

    不能在超过 900 字节的列上创建索引。不能将大对象 (LOB) 数据类型 ntext、text、varchar(max)、nvarchar(max)、varbinary(max)、xml 或 image 的列指定为索引的键列

    但是你可以使用included columns

    除了 text、ntext 和 image 之外的所有数据类型都是允许的。如果任何指定的非键列是 varchar(max)、nvarchar(max) 或 varbinary(max) 数据类型,则必须离线创建或重建索引 (ONLINE = OFF)。

    【讨论】:

    • 太棒了!这就是我正在寻找的信息。谢谢
    • +1。 ONLINE 操作不可用实际上是很重要的一点:引入 MAX 列会使所有 ONLINE 操作不可用。
    • 在线操作是什么意思?
    • 重建索引有离线和在线两种方式,离线时数据在重建期间将不可用,在线时数据可用(除了一小段时间)创建索引的时间段,正在持有锁)
    • 请注意,这种必须为 varchar(max) 离线构建的限制在 SQL Server 2012+ 中已经消失。 link
    【解决方案3】:

    选择 nvarchar(max) 也会影响由 sql server 引擎自动调整的执行计划优化。

    【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2014-11-28
    相关资源
    最近更新 更多