SQL查询执行顺序

EIZ

我有以下“相同”查询:

select * from myView where ID=1

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

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

稍后编辑: Kevchadders的建议非常有用。通过查看本文:http : //blogs.msdn.com/b/turgays/archive/2013/09/10/parameter-sniffing-problem-and-workarounds.aspx,我能够在第二种方法中使用以下变通办法脚本,“解决了问题”:

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

这可能是由于参数嗅探。

两者的执行计划可能并不相同,因此即使您运行的是相同的代码,SQL Server也会为每条SQL采用不同的执行路径。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章