我们开始在我们的应用程序中获得很多存储过程。其中许多用于自定义报告,其中许多不再使用。有谁知道我们可以在SQL Server 2005的系统视图上运行的查询,该查询可以告诉我们存储过程的最后执行日期?
Answers:
简而言之,不。
但是,您可以做一些“不错”的事情。
INSERT dbo.SPCall (What, When) VALUES (OBJECT_NAME(@@PROCID), GETDATE()
”您可以执行“有趣”的事情:
RAISERROR ('Warning: pwn3d: call admin', 16, 1)
,看看谁打来的WAITFOR DELAY '00:01:00'
,看看谁打来的你明白了。经过验证的IT支持“看谁打电话”方法。
如果报告是Reporting Services,则可以匹配代码以报告DataSet,则可以为报告运行挖掘RS数据库。
无论如何,您不能依赖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) = ''
我们应该使用数据库名称填充空白。
哦,现在要小心!所有闪光的不都是金子!所有“ stats” dm视图和功能都存在此类问题。它们仅针对高速缓存中的内容,而高速缓存中的内容的生存时间可以在数分钟内衡量。如果要使用这种方法来确定哪些SP是可以删除的候选对象,则删除几分钟前使用的SP可能会很受伤。
以下摘录摘自联机丛书中给定的dm视图…
sys.dm_exec_procedure_stats返回缓存的存储过程的综合性能统计信息。该视图每个存储过程包含一行,并且该行的生存期只要存储过程保持高速缓存即可。从缓存中删除存储过程时,将从该视图中删除相应的行。
sys.dm_exec_query_stats该视图在缓存的计划中每个查询语句包含一行,并且这些行的生命周期与计划本身相关。从缓存中删除计划时,将从该视图中删除相应的行。
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