我应该一直使用(n)varchar(max)
文本列吗?
没有。
对于SQL Server,max
仅应在没有其他选择时指定数据类型。而是应该选择正确的基本类型(varchar
或nvarchar
),并指定适合存储数据的明确的最大长度。
无论列的键入为varchar(n)
还是varchar(max)
,物理存储都是相同的,因此不必担心。
不选择(n)varchar(max)
任何地方的原因都围绕功能,计划质量和性能。
详尽的列表可能不切实际,但除其他外,max
列:
特征
- 需要单独的约束以强制最大长度
- 不能是索引中的键(因此也没有唯一约束)
- 可能会阻止在线DDL(包括索引重建和添加新的非null列)
- 通常不支持“较新”功能,例如列存储
- 有关更多特定功能和限制,请参阅产品文档。通常的模式是在
max
数据类型上有一些笨拙的限制。并非所有限制和副作用都记录在案。
性能
- 需要执行引擎中的特殊处理,以解决可能非常大的问题。通常,这涉及使用效率较低的代码路径以及流接口
- 可能会对外部代码(和其他SQL Server组件,如SSIS)产生类似的意外后果,还必须准备处理最大2GB的数据
- 在内存授权计算中假定为4000字节宽。这很可能导致过多的内存保留,这限制了并发性,并将有价值的索引和数据页从缓存中推出
- 禁用一些重要的性能优化
- 可能会延长锁定时间
- 可能会阻止优化器选择(非动态)搜索计划
- 防止过滤器进入扫描并寻找残留物
- 可能会增加tempdb压力和争用(取决于版本),因为变量和参数也可能被键入
max
以匹配列定义
总之,不必要地使用说明max
符会产生许多微妙的(和不良的)副作用,因此这样做是没有意义的。使用单个声明的次要“便利”是没有任何补偿的。
在上下文中评估每种类型,使用正确的基本类型(varchar
或nvarchar
)和合理的显式长度。
进一步阅读: