我想查看服务器上每个数据库的所有存储过程的列表以及上次运行该存储过程的时间。我非常擅长使用 SQL,但我不知道如何查看 SQL 保存的此类统计数据,因此如果能提供一些帮助来查找此信息,我将不胜感激。
编辑:
从我得到的答案来看,这听起来不像我想象的那样。我认为这可以类似于查看上次访问表的时间的方式完成:
select t.name, user_seeks, user_scans, user_lookups, user_updates,
last_user_seek, last_user_scan, last_user_lookup, last_user_update
from sys.dm_db_index_usage_stats i JOIN
sys.tables t ON (t.object_id = i.object_id)
where database_id = db_id()
上述脚本是从http://blog.sqlauthority.com/2009/05/09/sql-server-find-last-date-time-updated-for-any-table/。
答案1
下面是一个小脚本,它将列出服务器实例上所有数据库中的所有用户存储过程(即未附带 SQL Server 或不是系统存储过程的过程):
CREATE TABLE #ProcTable (
DbName sysname,
ProcName sysname
)
DECLARE @command1 NVARCHAR(1000)
SET @command1 = 'USE [?];INSERT #ProcTable
SELECT ''[?]'',Name
FROM sys.all_objects
WHERE TYPE=''p''
AND is_ms_shipped=0'
EXEC sp_msforeachdb @command1
SELECT * FROM #ProcTable
ORDER BY DbName,ProcName
DROP TABLE #ProcTable
如果您没有运行捕获 exec 事件的跟踪(并且没有运行默认跟踪),那么您必须有一个应用程序级审计机制来捕获存储过程的运行。如果您没有运行其中任何一个,那么您将无法回溯到过去查看过程何时运行。
答案2
没有本机日志记录可以执行此操作,因此您需要运行服务器端跟踪或设置某种审核来捕获此信息。
答案3
通过查看 SQL Server 2008 中引入的 sys.dm_exec_procedure_stats 动态管理视图,您可以获得该问题的有限答案。
select
DB_NAME(database_id) as "database_name"
, OBJECT_NAME(object_id, database_id) as "procedure_name"
, last_execution_time
from
sys.dm_exec_procedure_stats
对于任何存储过程计划在过程缓存中,这将告诉您上次执行的时间。(DMV 中还有更多有趣的列。)
此信息不一定完整:最多只包含自上次启动数据库引擎以来的信息(不会在服务重新启动后保留)。如果自服务器重新启动以来存储过程尚未运行,则不会出现在此处。清除计划缓存将导致此 DMV 被重置。清除计划缓存的操作(例如更改 MAXDOP 或内存设置)或以其他方式使缓存计划无效也会重置。
但是它可以给你一个大概的数据,如果你真的雄心勃勃的话,你可以编写一个例程,定期轮询 DMV,并将结果存储在表中以供长期分析。