存储过程中查询的执行计数不同

时间:2016-07-14 15:39:45

标签: sql-server stored-procedures sql-server-2008-r2 sql-execution-plan

我使用以下T-SQL代码执行了存储过程:

exec myStoredProcedure
go 10

执行程序后,我查看了sys.dm_exec_query_stats中的信息,发现对于存储过程中的某些查询,Execution Count中的值不同。

enter image description here

显然,对于存储过程中的一些查询,某些执行计划只运行了很多次,其中有7次是10次。

使用以下查询返回上述屏幕截图中的数据:

select ...
    qs.execution_count [Execution Count]
from sys.dm_exec_query_stats as qs
    cross apply sys.dm_exec_sql_text (qs.sql_handle) as st
    cross apply sys.dm_exec_text_query_plan (qs.plan_handle, qs.statement_start_offset, qs.statement_end_offset) as qp
where st.objectid = object_id('myStoredProcedure')  

正如您所看到的,没有为执行计数为3的此过程存储其他执行计划,认为优化程序决定使用其他计划运行查询。

真相是一些执行计数为7的查询是插入到不同的临时表中,SELECT INTO #temptable,但不是全部。{/ p>

所以,我的问题是为什么某些查询的计划执行次数比其他查询的次数少,这些查询的执行方式和计划是什么?

我想提一下,存储过程中没有逻辑可以生成不同的执行流,因此某些查询不会被执行。 (没有 IFs

此外 ,在此期间未运行任何统计信息更新或DML查询,因此发生了行计数或索引更改。 < / p>

我的查询超过了DMV是不正确的,并且没有拿起这些&#34;流氓&#34;计划?或者数据是否已缓存在临时表的memory / tempdb中,并在后续执行时从那里读取?

更新

添加了一个屏幕截图,其中包含plan_generation_num

所请求的@MartinBrown

enter image description here

1 个答案:

答案 0 :(得分:3)

Execution_Count字段定义为:

“自上次编译以来计划执行的次数。”

这表明在第四次运行中,一些计划被重新编制。我怀疑这是因为最初的计划从缓存中掉出来了。

请参阅https://msdn.microsoft.com/en-us/library/ms189741.aspx