【发布时间】:2016-11-17 15:03:28
【问题描述】:
我已经使用以下 T-SQL 代码执行了一个存储过程:
exec myStoredProcedure
go 10
程序执行后,我查看了sys.dm_exec_query_stats中的信息,发现对于存储过程中的一些查询,Execution Count中的值是不同的。
显然,对于存储过程中的某些查询,某些执行计划只运行了多次,十分之七。
上面截图中的数据是通过以下查询返回的:
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 查询,因此发生了行计数或索引更改。
我对@987654332@ 的查询是否不正确并且没有选择这些“流氓”计划?或者数据是否已缓存在内存/ tempdb 中用于临时表并在后续执行时从那里读取?
更新:
添加了包含plan_generation_num 列由@MartinBrown 请求的屏幕截图
【问题讨论】:
标签: sql-server stored-procedures sql-server-2008-r2 sql-execution-plan