当我在 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 而大吃一惊。我应该更了解。