NVARCHAR 和 VARCHAR 转换导致索引扫描
Posted
技术标签:
【中文标题】NVARCHAR 和 VARCHAR 转换导致索引扫描【英文标题】:NVARCHAR and VARCHAR conversion cause index scan 【发布时间】:2021-11-24 21:54:58 【问题描述】:declare @p0 nvarchar(4000)
select id_t_s from table1 where id_t = @p0
这将是索引扫描,因为 id_t 列是 varchar(100)。这将需要 145 毫秒。执行计划有警告。
表达式中的类型转换 (CONVERT_IMPLICIT(nvarchar(100),tables1.[id_t],0)=[@P0]) 可能会影响查询计划选择中的“SeekPlan”。
如果我将其更改为以下:
declare @p0 nvarchar(4000)
select id_t_s from table1 where id_t = @p0
这将是索引扫描,因为 id_t 列是 varchar(100)。耗时 0 毫秒。
declare @p0 varchar(4000)
select id_t_s from table1 where id_t = @p0
这将是索引查找。这将需要 0 毫秒。
有什么方法可以在不更改代码或表格的情况下修复它?
谢谢, 天空
【问题讨论】:
如果您的列数据类型是varchar
,那么您的变量的数据类型必须匹配,否则正如您已经注意到的,您将有一个不可分割的隐式转换。究竟需要修复什么?
【参考方案1】:
试试这个 WHERE 子句。
WHERE id_t = CAST(@p0 AS VARCHAR(4000))
这将允许服务器将列中的值与相同类型的数据进行比较。这让它可以做你想要的索引搜索。
考虑定义@p0 变量,使其具有与表列相同的数据类型。正如您所拥有的,您正尝试在 8 位(ASCII,latin1)列中查找 Unicode 值。 SQL Server 会为你做这件事,但比你想象的要慢。
【讨论】:
是的,转换功能也很好用。我的目标是不必更改代码或表定义。以上是关于NVARCHAR 和 VARCHAR 转换导致索引扫描的主要内容,如果未能解决你的问题,请参考以下文章
如何一次性将所有 varchar 列/变量/参数转换为 nvarchar 类型?
在现有 SQL Server 数据库上使用实体框架时禁用 VARCHAR 和 NVARCHAR 之间的转换