【问题标题】:NVARCHAR and VARCHAR conversion cause index scanNVARCHAR 和 VARCHAR 转换导致索引扫描
【发布时间】: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,那么您的变量的数据类型必须匹配,否则正如您已经注意到的,您将有一个不可分割的隐式转换。究竟需要修复什么?

标签: sql-server query-optimization


【解决方案1】:

试试这个 WHERE 子句。

WHERE id_t = CAST(@p0 AS VARCHAR(4000))

这将允许服务器将列中的值与相同类型的数据进行比较。这让它可以做你想要的索引搜索。

考虑定义@p0 变量,使其具有与表列相同的数据类型。正如您所拥有的,您正尝试在 8 位(ASCII,latin1)列中查找 Unicode 值。 SQL Server 会为你做这件事,但比你想象的要慢。

【讨论】:

  • 是的,转换功能也很好用。我的目标是不必更改代码或表定义。
猜你喜欢
  • 2017-08-31
  • 2021-06-09
  • 1970-01-01
  • 2018-08-20
  • 2013-04-07
  • 2011-12-11
  • 2019-08-26
  • 2015-08-04
  • 2018-04-01
相关资源
最近更新 更多