SQL Server 2014性能 - 参数化SQL与文字

时间:2015-08-14 19:34:57

标签: sql sql-server

我有一个像

这样的简单查询
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成本估算值更高。

具体差异:

  • 同一个索引搜索出现在两个计划中,但它在带有文字的(快)版本中是并行的,而在带有参数的(慢)版本中不是并行的。非并行的具有更高的CPU估计。
  • 带参数的版本有一个嵌套循环连接,用于连接索引扫描和参数周围的一些逻辑。这似乎会增加它自己的一些CPU开销(嵌套循环上的CPU估计值= 7.6)。
  • 两个版本都有“平行主义”作为哈希比赛的孩子;在参数化版本中,它是Distribute Streams(CPU估计值= 16.5)但在文字版本中它是Repartition Streams(CPU估计值= 8.3)

如何使参数化版本的执行与具有文字的版本类似?

我在研究中发现的参数化查询的性能与估算有关 - 计划缓存不同的参数值,或者局部变量被视为未知数。这里也不是一个因素;我的估计是正确的。

0 个答案:

没有答案