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

Different execution count for queries in a stored procedure

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

exec myStoredProcedure
go 10

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

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

以上屏幕截图中的数据通过以下查询返回:

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,但不是全部。

所以,我的问题是为什么有些查询的计划执行次数比其他查询少,这些查询是如何执行的以及使用什么计划?

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

此外,在此期间运行没有统计更新或 DML 查询,因此行计数或索引发生了变化。

我的查询 DMV 是否不正确并且没有选择这些 "rogue" 计划?或者数据是否已缓存在临时表的内存/tempdb 中并在后续执行时从那里读取?

更新:

添加了包含 plan_generation_num 列的屏幕截图 @MartinBrown

Execution_Count字段定义为:

"Number of times that the plan has been executed since it was last compiled."

这表明在第四天 运行 重新编译了一些计划。我怀疑这是由于原始计划从缓存中掉落而发生的。

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