我有一个像
这样的简单查询select count(distinct key)
from table
where date between '2014-01-01' and '2014-12-31'
它很快(大约1秒),但当我尝试在sp_executesql
内对其进行参数化时变得慢得多(大约4秒):
exec sp_executesql
N'select count(distinct key) from table where date between @start and @end',
N'@start date, @end date',
@start = '2014-01-01', @end='2014-12-31'
为什么表现有差异?
更新计划差异似乎是因为类型转换。当我将参数类型更改为N'@ start datetime,@ end datetime'时,为了精确匹配列,差异消失,参数与常量的计划几乎完全相同(相同的成本等)(Facepalm。)
我会接受一个解释,解释为什么类型转换会产生如此戏剧性的计划差异,而不是仅仅预先转换参数并照常进行。
END UPDATE
计划非常相似 - 相同的索引,相同的估计基数,相同的行数和相同的I / O - 尽管参数化版本中的CPU成本估算值更高。
具体差异:
如何使参数化版本的执行与具有文字的版本类似?
我在研究中发现的参数化查询的性能与估算有关 - 计划缓存不同的参数值,或者局部变量被视为未知数。这里也不是一个因素;我的估计是正确的。