SQL Server中存储过程的上次运行日期
我们开始在应用程序中获取大量存储过程。其中许多是用于定制报告,其中许多不再使用。有谁知道我们可以在SQL Server 2005的系统视图上运行一个查询,告诉我们存储过程执行的最后日期?SQL Server中存储过程的上次运行日期
简而言之,没有。
但是,您可以做的事情是“很好”的。
- 运行事件探查器跟踪用,也就是说,存储过程的名称
- 添加一行每个PROC(创建过程的TABEL)
- “
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,那么您可以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建议。
噢,小心吧!所有闪光的不都是金子!所有的“统计”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
这是一个很大的问题执行。 – NotMe 2009-02-27 17:31:04
我们有我们所有的Sprocs日志,他们被称为。我们所有的Sprocs都有一个会话ID参数,并且包含在日志中(以及任何错误和持续时间)。我们一直很舒适(迄今为止),并且它有助于调试/管理报告,通常 – Kristen 2009-02-27 17:46:22