为什么 SQL Server 在运行参数化查询时不使用索引查找?

Ste*_*ser 3 performance sql-server-2005

当我在 SQL Server 2005 中执行以下查询时,它使用索引查找,通过查看执行计划进行验证。

SELECT *
FROM   Account
WHERE  Number = '123456789'
Run Code Online (Sandbox Code Playgroud)

但是当我运行相同的查询但使用参数时,它使用索引扫描。

DECLARE @AccountNumber NVarChar(25)
SET @AccountNumber = '123456789'

SELECT *
FROM   Account
WHERE  Number = @AccountNumber
Run Code Online (Sandbox Code Playgroud)

由于这个表有超过 1000 万行,第二次查询需要 30 多秒,而第一个查询只需要几毫秒。我真的必须去更改我的所有查询以不使用参数吗?

gbn*_*gbn 7

使用常量和变量之间存在差异,因为简单地说,SQL Server 尝试针对一般情况进行优化。

但是,在这种情况下,我的第一个想法是数据类型优先级导致隐式转换。Number 列是什么数据类型?

示例:说它是 varchar(25)。nvarchar 的优先级高于 varchar,因此在比较之前被隐式转换

我最近被 varchar 与 SUSER_SNAME 的比较所困扰。我应该更清楚。