SQL Server 2008R2 sys.dm_exec_procedure_stats-上次执行时间异常

时间:2018-07-10 10:20:53

标签: sql sql-server sql-server-2008-r2

我有一份可以从sys.dm_exec_procedure_stats中捕获数据的工作。 作业每分钟运行一次。它是从无连接的直接插入。 我遇到的情况是,一个特定的对象ID经常(每个星期两天都一样,没有失败)返回类似以下的内容

timeOfCapture /LastExecutionTime

16:58 / 16:30

16:59 / 16:30

17:00 / 16:30

17:01 / 17:00       (no explanation)

17:02 / 16:30       (no explanation - back to normal)

17:03 / 16:30

存储过程由大约16:30开始的作业调用 据我所知,该存储过程未在17:00运行。 有一个工作从17:00开始,但不执行此存储过程。 存储过程大约需要30秒才能完成。

所有对象的ID都相同,数据库ID也相同。

这种定期发生而没有失败的事实意味着也许还有另一个过程

我不知道是否有重启之类的事情 我也不确定是否有可能调用存储过程的外部进程(其他服务器/ excel / etc),或者可能存在回滚。

这可能是个红鲱鱼,我忽略了一些,但是我检查了所有我能想到的。 关于那些LastExecutionTimes有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

该DMV为每个已缓存存储过程计划包含一行,并且该行的生存期只要存储过程保持高速缓存即可。这意味着该存储过程在此表中可以具有多个行,如果它们在缓存中没有计划,则根本不行。 last_execution_time对应于该行的查询计划最后一次执行该过程的时间。因此,根据您的情况,该过程可能在前一天的1630(因为您没有显示日期)之后在当天的1700处执行,反之亦然。考虑到您的方案的可重复性,您当前的工作很可能使用一个计划,而另一项工作(甚至在另一天)正在使用另一个计划。目前尚不清楚您如何选择要插入的行...可能是TOP 1而没有ORDER BY。这可能会导致此行为。我们需要查看正在执行 logging

的insert语句

请注意,有很多事情可能导致计划从缓存中删除或创建新计划。在具有固定参数的Job中,后者的可能性较小。

如果您确实要跟踪过程的执行(不仅是缓存计划的最后一次执行),则需要设置日志记录机制。 Aaron has a good article on it her e。