SQL Server中存储过程的上次运行日期


76

我们开始在我们的应用程序中获得很多存储过程。其中许多用于自定义报告,其中许多不再使用。有谁知道我们可以在SQL Server 2005的系统视图上运行的查询,该查询可以告诉我们存储过程的最后执行日期?


2
我们已经调用了所有的Sprocs日志。我们所有的Sproc都有一个用于Session ID的参数,该参数包含在日志中(以及引发的任何错误和持续时间)。我们对开销一直很满意(到目前为止!),它经常有助于调试/管理报告
Kristen 2009年

Answers:


35

简而言之,不。

但是,您可以做一些“不错”的事情。

  1. 使用存储的过程名称运行探查器跟踪
  2. 在每个过程中添加一行(当然要创建一个表格)
    • INSERT dbo.SPCall (What, When) VALUES (OBJECT_NAME(@@PROCID), GETDATE()
  3. 持续时间延长2

您可以执行“有趣”的事情:

  1. 删除它,看看谁打来的
  2. 删除权限,查看谁打电话
  3. 添加RAISERROR ('Warning: pwn3d: call admin', 16, 1),看看谁打来的
  4. 添加WAITFOR DELAY '00:01:00',看看谁打来的

你明白了。经过验证的IT支持“看谁打电话”方法。

如果报告是Reporting Services,则可以匹配代码以报告DataSet,则可以为报告运行挖掘RS数据库

无论如何,您不能依赖DMV,因为它们是在SQL Server重新启动时重置的。查询缓存/锁是临时的,不会持续任何时间。


我首先使用“看谁呼叫”在终端控制器上查找额外的端口。
克里斯·卡蒂尼亚尼

50

下面的代码应该可以解决问题(> = 2008)

SELECT o.name, 
       ps.last_execution_time 
FROM   sys.dm_exec_procedure_stats ps 
INNER JOIN 
       sys.objects o 
       ON ps.object_id = o.object_id 
WHERE  DB_NAME(ps.database_id) = '' 
ORDER  BY 
       ps.last_execution_time DESC  

编辑1:请注意以下Jeff Modens的建议。


+1一个非常有用的脚本,谢谢,小幅盘整,在第二行,你错过了一个“e”,它应该是a.last_execution_time
AmmarR

1
谢谢,并为此+1。DMV非常有用。我们还能得到程序提供的输入参数吗?
Neeraj Prasad Sharma 2014年

3
真好 我假设WHERE DB_NAME(ps.database_id) = ''我们应该使用数据库名称填充空白。
Baodad

它不显示所有存储过程,仅显示最后运行的存储过程

29

哦,现在要小心!所有闪光的不都是金子!所有“ stats” dm视图和功能都存在此类问题。它们仅针对高速缓存中的内容,而高速缓存中的内容的生存时间可以在数分钟内衡量。如果要使用这种方法来确定哪些SP是可以删除的候选对象,则删除几分钟前使用的SP可能会很受伤。

以下摘录摘自联机丛书中给定的dm视图…

sys.dm_exec_procedure_stats返回缓存的存储过程的综合性能统计信息。该视图每个存储过程包含一行,并且该行的生存期只要存储过程保持高速缓存即可。从缓存中删除存储过程时,将从该视图中删除相应的行。

sys.dm_exec_query_stats该视图在缓存的计划中每个查询语句包含一行,并且这些行的生命周期与计划本身相关。从缓存中删除计划时,将从该视图中删除相应的行。


3
因此可以公平地说,如果@Pixelated提供的查询中存在某个条目,则最后一次执行时间是准确的,但是如果缺少某个条目,那么您将无法对其最后执行时间做任何假设?
Crispalot爵士,2015年

6
对于最后的答复,我深表歉意。我最近没来过这里。您上面所说的是正确的。
杰夫·摩登

8

sys.dm_exec_procedure_stats包含有关执行功能,约束和过程等的信息。但是该行的生命周期是有限制的。从缓存中删除执行计划的那一刻起,该条目就会消失。

Use [yourDatabaseName]
GO
SELECT  
        SCHEMA_NAME(sysobject.schema_id),
        OBJECT_NAME(stats.object_id), 
        stats.last_execution_time
    FROM   
        sys.dm_exec_procedure_stats stats
        INNER JOIN sys.objects sysobject ON sysobject.object_id = stats.object_id 
    WHERE  
        sysobject.type = 'P'
    ORDER BY
           stats.last_execution_time DESC  

这将为您提供最近执行的过程的列表。

如果要检查最近是否执行过垂直存储过程

SELECT  
    SCHEMA_NAME(sysobject.schema_id),
    OBJECT_NAME(stats.object_id), 
    stats.last_execution_time
FROM   
    sys.dm_exec_procedure_stats stats
    INNER JOIN sys.objects sysobject ON sysobject.object_id = stats.object_id 
WHERE  
    sysobject.type = 'P'
    and (sysobject.object_id = object_id('schemaname.procedurename') 
    OR sysobject.name = 'procedurename')
ORDER BY
       stats.last_execution_time DESC  

4

如果在SQL Server 2016或更高版本上启用了查询存储,则可以使用以下查询来获取最后的SP执行。历史记录取决于查询存储配置。

SELECT 
      ObjectName = '[' + s.name + '].[' + o.Name  + ']'
    , LastModificationDate  = MAX(o.modify_date)
    , LastExecutionTime     = MAX(q.last_execution_time)
FROM sys.query_store_query q 
    INNER JOIN sys.objects o
        ON q.object_id = o.object_id
    INNER JOIN sys.schemas s
        ON o.schema_id = s.schema_id
WHERE o.type IN ('P')
GROUP BY o.name , + s.name 

1

在2005年工作正常(如果计划在缓存中)

USE YourDb;

SELECT qt.[text]          AS [SP Name],
       qs.last_execution_time,
       qs.execution_count AS [Execution Count]
FROM   sys.dm_exec_query_stats AS qs
       CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE  qt.dbid = DB_ID()
       AND objectid = OBJECT_ID('YourProc') 

1

我用这个:

use YourDB;

SELECT 
    object_name(object_id), 
    last_execution_time, 
    last_elapsed_time, 
    execution_count
FROM   
     sys.dm_exec_procedure_stats ps 
where 
      lower(object_name(object_id)) like 'Appl-Name%'
order by 1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.