【问题标题】:Different execution count for queries in a stored procedure存储过程中查询的不同执行计数
【发布时间】: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 查询,因此发生了行计数或索引更改。

我对@9​​87654332@ 的查询是否不正确并且没有选择这些“流氓”计划?或者数据是否已缓存在内存/ tempdb 中用于临时表并在后续执行时从那里读取?

更新:

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

【问题讨论】:

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


    【解决方案1】:

    Execution_Count 字段定义为:

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

    这表明在第四次运行时重新编译了一些计划。我怀疑这是由于原始计划超出缓存而发生的。

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

    【讨论】:

    • 好吧,没有OPTION (RECOMPILE) 在过程级别或语句级别指定。不过,这些查询使用了哪些新的执行计划,这些新的“流氓”计划在哪里?我的 DMV 查询不应该接他们吗? (我假设即使旧计划被放弃,一些新计划也被用来执行查询) - 如果我的知识是正确的。
    • 有很多因素会导致重新编译:请参阅stackoverflow.com/a/9054308/20553。我认为旧计划(预重新编译)已从缓存中丢失。您的计划中的创建时间看起来像是新计划。
    • plan_generation_num 的值是多少?
    • 我添加了带有plan_generation_num 的屏幕截图。我有点困惑这意味着什么。重新编译后的计划实例?重新编译后是否有更多的计划实例?不同的实例不是意味着不同的计划吗?
    • 这个数字是否意味着在重新编译后优化器提出了相同的计划(它使用的)并因此增加了plan_generation_num 的值?但是.. 没有增加execution_count 的值? (这听起来有点疯狂),我还是很困惑..
    猜你喜欢
    • 2017-05-21
    • 2010-10-05
    • 2017-07-30
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多