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

当我在SQL Server 2005中执行以下查询时,它使用索引查找,如查看执行计划所validation的那样。

SELECT * FROM Account WHERE Number = '123456789' 

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

 DECLARE @AccountNumber NVarChar(25) SET @AccountNumber = '123456789' SELECT * FROM Account WHERE Number = @AccountNumber 

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

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

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

例如:说它是varchar(25)。 nvarchar比varchar具有更高的优先级,因此该列在比较之前被隐式转换

我最近通过比较varchar和SUSER_SNAME而被咬了。 我应该知道更好。