当我在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而被咬了。 我应该知道更好。