明年,我正在努力清理几个sql Server环境.
我们有大约10,000个存储过程并且估计它们中只有大约1000个被定期使用,而另外200个左右被用于极少数情况,这意味着我们有很多工作要做.
由于我们有多个可以访问这些数据库和过程的部门和团队,因此我们并不总是调用这些过程的人,这意味着我们必须确定调用哪些过程.最重要的是,我们希望在几个月内确定这一点,而不是在几天内(这消除了一些可能性).
一种方法是使用sql Server Profiler并跟踪调用的过程,并将它们与我们所拥有的过程列表进行比较,同时标记是否使用过程.从那时起,我们可以将程序移动到不同的模式,以防部门尖叫.
解决方法
您可以在测试或业务周期中使用
server side trace(与使用Profiler GUI不同,产生更多资源),并仅捕获与SP相关的内容.然后,您可以将其加载到表或Excel中以进行进一步分析.
第二种方法,是使用DMV sys.dm_exec_procedure_stats(限制,如果重新启动sql server,则刷新数据).
您甚至可以安排作业将DMV数据捕获到表中以使其保持不变.
-- Get list of possibly unused SPs (sql 2008 only) SELECT p.name AS 'SP Name' -- Get list of all SPs in the current database FROM sys.procedures AS p WHERE p.is_ms_shipped = 0 EXCEPT SELECT p.name AS 'SP Name' -- Get list of all SPs from the current database FROM sys.procedures AS p -- that are in the procedure cache INNER JOIN sys.dm_exec_procedure_stats AS qs ON p.object_id = qs.object_id WHERE p.is_ms_shipped = 0;
参考:
> How to find unused Stored Procedures in SQL Server 2005/2008
> Identifying Unused Objects in a Database