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

时间:2009-02-27 17:26:47

标签: sql-server

我们开始在应用程序中获得大量存储过程。其中许多是针对自定义报告的,其中许多报告已不再使用。有没有人知道我们可以在SQL Server 2005中的系统视图上运行的查询,它会告诉我们存储过程的最后执行日期?

8 个答案:

答案 0 :(得分:44)

以下代码应该可以解决问题(> = 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 :(得分:31)

简而言之,不。

然而,你可以做些“好”的事情。

  1. 使用存储的proc名称
  2. 运行探查器跟踪
  3. 每个proc添加一行(当然创建一个tabel)
    • INSERT dbo.SPCall (What, When) VALUES (OBJECT_NAME(@@PROCID), GETDATE()
  4. 持续时间延长2
  5. 你可以做一些“有趣”的事情:

    1. 删除它,看看谁打电话
    2. 删除权限,查看谁致电
    3. 添加RAISERROR ('Warning: pwn3d: call admin', 16, 1),查看谁来电话
    4. 添加WAITFOR DELAY '00:01:00',查看谁来电话
    5. 你明白了。经过实践检验的“看谁调用”IT支持方法。

      如果报告是Reporting Services,那么如果您可以匹配代码以报告DataSet,则可以mine the RS database运行报告。

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

答案 2 :(得分:25)

哦,现在小心!所有闪光的不都是金子!所有“统计数据”dm视图和函数都有这类事情的问题。它们只能用于缓存中的内容,缓存中的生命周期可以用几分钟来衡量。如果您要使用这样的东西来确定哪些SP是被删除的候选者,那么当您删除几分钟前使用过的SP时,您可能会受到伤害。

以下摘录来自联机丛书,了解给定的dm视图......

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

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

答案 3 :(得分:6)

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 :(得分: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') 

答案 5 :(得分:1)

如果在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 

答案 6 :(得分:0)

我用这个:

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

答案 7 :(得分:0)

您还应该警惕任何仅“定期”存储的proc或对象,例如,运行接近EOFY的SP可能很重要-仅仅因为它已经运行了将近一年并不意味着它不需要。当然可以使用DMV作为指导原则(尽管它们仅显示自上次服务器重新启动以来的历史记录),但是请不要单独使用它。