SQL查询执行序列

时间:2014-05-01 12:26:00

标签: sql sql-server-2012

我有以下"相同"查询:

select * from myView where ID=1

declare @ID int
set @ID=1
select * from myView where ID=@ID

myView是一个带有几个内部和外部联接的视图(不是索引视图)。未过滤的视图输出为@ 100 mil行。对于ID = 1,输出为@ 10k行。第一个查询在几秒钟内返回,另一个查询在几个小时内运行。它们似乎相同",但显然幕后(在查看执行计划时)我可以得出这样的事实:第二个脚本中对视图的过滤仅应用于整个视图之后的结尾被查询。为什么会发生这种情况,或者是否有人对此有更好更明确的解释?

稍后编辑: Kevchadders的建议非常有用。通过查看这篇文章:http://blogs.msdn.com/b/turgays/archive/2013/09/10/parameter-sniffing-problem-and-workarounds.aspx我能够对第二个脚本使用以下解决方法,即#34;解决了问题":

declare @ID int
set @ID=1
select * from myView where ID=@ID
option(recompile)

1 个答案:

答案 0 :(得分:4)

这可能是由于参数嗅探造成的。

两者的执行计划可能不尽相同,所以即使你运行的是相同的代码,sql server也会为每一段SQL采用不同的执行路径。

可能值得看看各自的执行计划,看看你是否能发现任何差异。根据使用OPTION(RECOMPILE)的问题。