SQL性能:使用NVarchar(MAX)而不是NVarChar(200)是否有任何性能损失

wil*_*lvv 37 sql-server indexing performance nvarchar

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

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

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

使用nvarchar(max)列创建索引是否有任何限制,或者是否需要在大小限制上添加限制?

谢谢!

Rem*_*anu 35

严格来说,MAX类型总是比非MAX类型慢一点,请参阅varchar(max)与varchar(N)的性能比较.但是这种差异在实践中永远不可见,它只是在由IO驱动的整体性能中变成噪音.

您的主要关注点不应该是MAX与非MAX的表现.您应该关注这个列可能需要存储超过8000个字节的问题吗?如果答案是肯定的,即使是非常非常不可能,那么答案显而易见:使用MAX类型,稍后将此列转换为MAX类型的痛苦不值得非MAX类型的次要性能优势.

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

顺便说一下,关于溢出区域中剩余数据超过4KB的列的信息是错误的.表和索引组织中的信息正确:

ROW_OVERFLOW_DATA分配单位

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

因此,不是超过4KB的列,是不适合页面上的可用空间的行,而不是"剩余",是整个列.


SQL*_*ace 18

无法在超过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).

  • 请注意,在SQL Server 2012+中,必须为varchar(max)进行脱机构建的这一限制已经消失.[链接](https://msdn.microsoft.com/en-us/library/ms188388(V = SQL.105)的.aspx) (2认同)

Far*_*hid 5

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

  • 如果“影响”是好是坏,可能值得添加,也许还有一个显示参考的链接。 (3认同)