繁体   English   中英

SQL查询执行序列

[英]SQL query execution sequence

我有以下“相同”的查询:

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我能够使用以下解决方法进行第二次脚本,“解决了问题”:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM