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

问题描述:

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

+2

这是一个很大的问题执行。 – NotMe 2009-02-27 17:31:04

+2

我们有我们所有的Sprocs日志,他们被称为。我们所有的Sprocs都有一个会话ID参数,并且包含在日志中(以及任何错误和持续时间)。我们一直很舒适(迄今为止),并且它有助于调试/管理报告,通常 – Kristen 2009-02-27 17:46:22

简而言之,没有。

但是,您可以做的事情是“很好”的。

  1. 运行事件探查器跟踪用,也就是说,存储过程的名称
  2. 添加一行每个PROC(创建过程的TABEL)
    • 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,那么您可以mine the RS database为报告运行,如果您可以匹配代码来报告DataSet。

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

下面的代码应该做的伎俩(> = 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:请注意以下杰夫Modens建议。

+0

只适用于SQL 2008及以上版本 – Kodak 2012-08-14 17:41:02

+0

+1一个非常有用的脚本,谢谢,小小的更正,在您错过的第二行一个'e',它应该是'a.last_execution_time`, – AmmarR 2013-03-12 09:09:40

噢,小心吧!所有闪光的不都是金子!所有的“统计”DM视图和函数都有这种类型的问题。它们只能处理缓存中的内容,并且可以在几分钟内测量缓存中的内容。如果您要使用这样的事情来确定哪些SP可能会被丢弃,那么当您删除几分钟前使用过的SP时,您可能会受到伤害。

以下节选自联机丛书对于给定的DM意见...

sys.dm_exec_procedure_stats 返回缓存的存储过程的总体性能统计数据。该视图每个存储过程包含一行,并且该行的生命周期与存储过程保持高速缓存一样长。从缓存中删除存储过程时,相应的行将从此视图中消除。

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

这正常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') 

我用这个:

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 

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 

这会给你最近执行过程的列表。

如果你想检查是否perticular存储过程最近

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