Ste*_*man 18 t-sql sql-server sql-server-2008-r2
我试图跟踪数据库中从未使用过的所有存储过程,或者在几个月内未使用过的存储过程.
我想找到一个查询来显示所有未使用的存储过程,以便可以分析这些存储过程以确定是否可以删除它们.
我熟悉sys.procedures,但不知道如何确定某个程序是否正在使用.
SELECT *
FROM sys.procedures;
Run Code Online (Sandbox Code Playgroud)
使用SQL Server 2008 R2.
更新更新更新
使用下面的Aaron Bertrand的查询,略微修改,这是我最终使用的,它是完美的.
SELECT p.*
FROM sys.procedures AS p
LEFT JOIN sys.dm_exec_procedure_stats AS s ON s.[object_id] = p.[object_id]
WHERE s.object_id IS NULL;
Run Code Online (Sandbox Code Playgroud)
谢谢你的hlep.
Aar*_*and 28
DMV将记录程序的统计数据,但它们可能只能追溯到最后一次重启(通常不会那么远,具体取决于计划在缓存中的运行时间):
SELECT * FROM sys.dm_exec_procedure_stats AS s
INNER JOIN sys.procedures AS p
ON s.[object_id] = p.[object_id]
ORDER BY p.name;
Run Code Online (Sandbox Code Playgroud)
因此,如果您的系统只运行了很短的时间,这不是一个可靠的措施.@Siva指出的链接对于其他一些想法也很有用.不幸的是,SQL Server并没有真正为你整体跟踪这个,所以除非你添加跟踪或记录,否则你会被放在DMV中的信任...
编辑它是一个好点,我正在解决已经运行的程序.相反,你可能想要这个:
SELECT sc.name, p.name
FROM sys.procedures AS p
INNER JOIN sys.schemas AS sc
ON p.[schema_id] = sc.[schema_id]
LEFT OUTER JOIN sys.dm_exec_procedure_stats AS st
ON p.[object_id] = st.[object_id]
WHERE st.[object_id] IS NULL
ORDER BY p.name;
Run Code Online (Sandbox Code Playgroud)
或者您可能还希望包含已运行的过程,但在上次运行时按顺序排序:
SELECT sc.name, p.name
FROM sys.procedures AS p
INNER JOIN sys.schemas AS sc
ON p.[schema_id] = sc.[schema_id]
LEFT OUTER JOIN sys.dm_exec_procedure_stats AS st
ON p.[object_id] = st.[object_id]
ORDER BY st.last_execution_time, p.name;
Run Code Online (Sandbox Code Playgroud)
这将首先排序自重新启动以来尚未运行的过程,然后是最后一次执行的过程,最先执行的最旧过程.
| 归档时间: |
|
| 查看次数: |
20455 次 |
| 最近记录: |