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?

如何一次性将所有 varchar 列/变量/参数转换为 nvarchar 类型?

在现有 SQL Server 数据库上使用实体框架时禁用 VARCHAR 和 NVARCHAR 之间的转换

将列从 varchar 转换为 nvarchar 是不是会更改存储在列中的字符串的编码?

char , varchar和Nvarchar区别

char,varchar,nvarchar,nchar