提问人:Jon Edmiston 提问时间:2/28/2009 最后编辑:marc_sJon Edmiston 更新时间:8/3/2023 访问量:170202
SQL Server 中存储过程的上次运行日期
Last Run Date on a Stored Procedure in SQL Server
问:
我们开始在应用程序中获得大量存储过程。其中许多用于自定义报告,其中许多已不再使用。有谁知道我们可以在 SQL Server 2005 中的系统视图上运行的查询,该查询会告诉我们上次执行存储过程的日期?
答:
简而言之,没有。
但是,您可以做一些“好”的事情。
- 使用存储的进程名称运行探查器跟踪
- 每个 proc 添加一行(当然创建一个标签)
- "
INSERT dbo.SPCall (What, When) VALUES (OBJECT_NAME(@@PROCID), GETDATE()
"
- "
- 延长 2 的持续时间
您可以做一些“有趣”的事情:
- 删除它,看看谁来电
- 删除权限,查看谁来电
- 添加,查看谁来电
RAISERROR ('Warning: pwn3d: call admin', 16, 1)
- 添加,查看谁来电
WAITFOR DELAY '00:01:00'
你明白了。久经考验的“看谁来电”的 IT 支持方法。
如果报表是 Reporting Services,则可以挖掘报表运行的 RS 数据库,前提是可以将代码与报表 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 : 请注意下面的 Jeff Modens 建议。如果您在此处找到程序,则可以确定它是准确的。如果你不知道,那么你只是不知道 - 你不能断定它没有运行。
评论
a.last_execution_time
WHERE DB_NAME(ps.database_id) = ''
and [name] = 'your_SP_name'
哦,现在要小心!闪光的未必都是金子!对于此类事情,所有“stats”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
这将为您提供最近执行的过程列表。
如果要检查最近是否执行了特定存储过程
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
如果在 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
评论