我使用以下T-SQL代码执行了存储过程:
exec myStoredProcedure
go 10
执行程序后,我查看了sys.dm_exec_query_stats
中的信息,发现对于存储过程中的某些查询,Execution Count
中的值不同。
显然,对于存储过程中的一些查询,某些执行计划只运行了很多次,其中有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
列
答案 0 :(得分:3)
Execution_Count字段定义为:
“自上次编译以来计划执行的次数。”
这表明在第四次运行中,一些计划被重新编制。我怀疑这是因为最初的计划从缓存中掉出来了。