查找 <n> 天内未被调用的过程

Fel*_*oto 7 sql-server-2008 sql-server stored-procedures maintenance

我们正在删除旧的存储过程和表。

我怎么知道最近没有调用哪些程序?

dm_exec_procedure_stats并且dm_exec_query_stats不可靠,因为它们只返回计划缓存中的过程。

Aar*_*and 12

如果sys.dm_exec_procedure_stats对您来说不可靠(可能更多是因为信息在重新启动后无法保留,而不是与计划缓存有关),SQL Server 不会以任何其他方式跟踪此信息。

这样做的唯一方法是将日志记录添加到您的存储过程(或调用它们的应用程序,如果可行且具有足够的包容性),或者永久运行非常有针对性的服务器端跟踪并查看跟踪。

另请注意,仅仅因为一个过程在一周内没有被调用并不意味着它明天不会被调用。您可能有仅每月或每年调用的报告程序,或者一些不经常发生的模糊操作。删除该存储过程可能会在几天或几周后灾难性地发生,可能超出您当时拥有的任何备份(并假设您没有遵循最佳实践并将存储过程存储在源代码控制中)。

恕我直言,最安全的方法是重命名zzz_您已经通过其他方式识别为“太旧”的潜在候选者的存储过程(可能带有前缀,以便它们排序到任何列表的底部)-至少当您不经意地对一个人执行此操作并且出现问题,很容易再次重命名它,恢复功能而无需在备份中寻找旧代码。只有当一个完整的商业周期过去了,没有人抱怨时才删除程序。


Rem*_*anu 6

如果您可以修改程序,请在每个程序的开头添加一行(这很容易自动化):

exec sp_trace_generateevent 82, N'<procedure__name>';
Run Code Online (Sandbox Code Playgroud)

使用sp_trace_generateevent是相当良性的,不会影响过程执行流程/结果/结果。最重要的是,它与当前事务没有交互。它不会将只读过程转换为数据写入过程,并具有所有日志记录和锁定含义。如果没有跟踪监视事件 82,则exec呼叫基本上是免费的(无操作)。

接下来创建服务器端跟踪并捕获事件 82(第一个 user_event)。n 天后收集生成的跟踪并汇总使用情况。确保您的跟踪写入具有足够空间和足够 IO 带宽的磁盘。对于额外的信用,您还可以定期检查跟踪并exec从您在那里找到的任何过程中删除调用,因为已证明已被调用。