我想查看服务器上每个数据库的所有存储过程以及最后一次存储过程的运行时间列表。 我用SQL很好,但是我不知道如何查看这样的数据,SQL保持所以我会很感激有点帮助find这个信息。
编辑:
从答案我得到这听起来像这是不可能的,我认为这是可能的。 我在想,可以这样做,就像你可以看到上次访问表的时间一样:
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/上的评论中被盗的。
这是一个小脚本,它将列出服务器实例上所有数据库中的所有用户存储过程(即那些没有附带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事件的跟踪(并且没有运行默认跟踪),那么您必须有一个应用程序级审计机制来捕获存储过程的运行。 如果你没有这两种方法,那么你就无法及时回过头来看看特效的运行时间。
没有本地日志logging这样做,所以您需要运行服务器端跟踪或设置某种审计来捕获此信息。
您可以通过查看SQL Server 2008中引入的sys.dm_exec_procedure_statsdynamicpipe理视图来获得有限的答案。
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
对于过程高速caching中的任何存储过程计划,这将告诉您最后的执行时间。 (DMV中还有更多有趣的列。)
这个信息不一定是完整的:最好只有在数据库引擎上次启动后才会有信息(在服务重新启动时不保留)。如果存储过程在服务器重启后没有运行,在这里。 清除计划caching将导致此DMV被重置。 正如那些将计划caching清除为副作用的操作一样(例如更改MAXDOP或内存设置),或者使caching的计划无效。
但是它会给你一个提示,如果你感觉真的有雄心壮志,你可以编写一个例程,定期轮询DMV,并将结果存储在一个表格中进行长期分析。