我想知道定义 nvarchar(max) 类型的列而不是给它一个(较小的)最大大小是否有任何缺点。
我在某处读到,如果列值超过 4?KB,则剩余数据将被添加到“溢出”区域,这没关系。
我正在创建一个表格,其中大部分时间文本只有几行,但我想知道设置下限然后添加验证以避免打破该限制是否有任何优势。
对使用 nvarchar(max) 列创建索引是否有任何限制,或者是否需要为必须添加对大小限制的限制而付出代价?
谢谢!
我想知道定义 nvarchar(max) 类型的列而不是给它一个(较小的)最大大小是否有任何缺点。
我在某处读到,如果列值超过 4?KB,则剩余数据将被添加到“溢出”区域,这没关系。
我正在创建一个表格,其中大部分时间文本只有几行,但我想知道设置下限然后添加验证以避免打破该限制是否有任何优势。
对使用 nvarchar(max) 列创建索引是否有任何限制,或者是否需要为必须添加对大小限制的限制而付出代价?
谢谢!
严格来说,这些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 的列,是不适合页面上可用空间的行,不是“剩余”,是整个列。
不能在超过 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)。
选择 nvarchar(max) 也会影响由 sql server 引擎自动调整的执行计划优化。