NVARCHAR与VARCHAR转换引发索引扫描 无需改代码表结构的方案咨询
问题核心原因
SQL Server中nvarchar数据类型优先级高于varchar,当查询参数为nvarchar类型、匹配的表字段为varchar类型时,数据库会隐式将表字段逐行转换为nvarchar后再做匹配,导致字段上的索引无法被用于查找,只能触发全索引扫描。
无需修改业务代码、无需修改表结构的解决方案
方案1:新增持久化计算列并创建对应索引
主动将varchar类型的id_t字段转换为nvarchar类型生成持久化计算列,为该计算列创建覆盖查询需求的索引后,原业务查询可自动匹配该索引走查找,完全不需要改动原有代码和表字段定义。
示例代码:-- 新增持久化计算列 ALTER TABLE table1 ADD id_t_nvarchar AS CAST(id_t AS NVARCHAR(100)) PERSISTED; -- 创建覆盖查询的非聚集索引 CREATE NONCLUSTERED INDEX IX_table1_id_t_nvarchar ON table1(id_t_nvarchar) INCLUDE (id_t_s);方案2:创建计划向导(Plan Guide)固定执行计划
直接通过SQL Server的计划向导功能,为该指定参数类型的查询绑定正确的执行计划,强制走id_t字段上的原有索引,不需要改动任何业务代码和表结构。
示例代码:
注意将代码中的EXEC sp_create_plan_guide @name = N'Fix_id_t_Implicit_Conversion_Guide', @stmt = N'select id_t_s from table1 where id_t = @p0', @type = N'SQL', @params = N'@p0 nvarchar(4000)', @hints = N'OPTION (TABLE HINT(table1, INDEX(IX_your_original_id_t_index_name)))'IX_your_original_id_t_index_name替换为id_t字段上现有的索引名称即可。
内容的提问来源于stack exchange,提问作者Sky Ricer
相关产品推荐
相关产品推荐

