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

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

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

SELECT *
FROM   Account
WHERE  Number = '123456789'

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

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

SELECT *
FROM   Account
WHERE  Number = @AccountNumber

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

答案1

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

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

例如:varchar(25)。nvarchar 的优先级高于 varchar,因此该列被隐式转换进行比较之前。

最近,我通过比较 varchar 和 SUSER_SNAME 而大吃一惊。我应该更了解。

相关内容