明年,我将帮助清理几个 SQL Server 环境。
我们有大约 10,000 个存储过程,估计其中只有大约 1000 个被定期使用,另外 200 个左右在极少数情况下使用,这意味着我们有很多工作要做。
由于我们有多个部门和团队可以访问这些数据库和程序,因此我们并不总是调用这些程序,这意味着我们必须确定正在调用哪些程序。最重要的是,我们希望在几个月内确定这一点,而不是在几天内(这消除了一些可能性)。
一种方法是使用SQL Server Profiler
并跟踪正在调用的过程,并将它们与我们拥有的过程列表进行比较,同时标记这些过程是否被使用。从那时起,我们可以将程序转移到不同的模式,以防部门尖叫。
在这里使用Profiler
最有效的方法吗?和/或你们中的任何人有没有做过类似的事情并找到另一种方式/更好的方式来做到这一点?
您可以在测试或业务周期期间使用服务器端跟踪 (与使用会产生更多资源的 Profiler GUI 不同)并仅捕获与 SP 相关的内容。然后,您可以将其加载到表格或 Excel 中以进行进一步分析。
第二种方法,是使用 DMV sys.dm_exec_procedure_stats(有限制,如果 sql server 重新启动,则数据被刷新)。
您甚至可以安排一项作业以将 DMV 数据捕获到表中以保持其持久性。
参考:
您会发现这个问题很有用,它适用于表和列,但建议使用第三方工具 ApexSQL Clean,它还可以找到未使用的存储过程以及数据库或外部数据库中任何其他对象未引用的所有对象
免责声明:我作为支持工程师在 ApexSQL 工作
如果您使用的是 SQL Server 2008+,您还可以使用带有histogram target的扩展事件。可能这会比痕迹更轻。
AFAIK 您需要为每个感兴趣的数据库创建一个不同的会话,尽管我看不到任何迹象表明可以对多个列进行分桶。下面的快速示例过滤
database_id=10
然后在该数据库中运行一些存储过程几次并使用
输出是
例如,显示带有
object_id
of的过程1287675635
执行了 36 次。这asynchronous_bucketizer
只是内存,所以最好设置一些经常轮询它并保存到持久存储的东西。作为Kin的剧本的后续。这是一个简单的脚本,用于创建一个表来跟踪一段时间内的使用情况以及一个定期更新它的脚本。
这篇文章还提供了一个查找未使用对象的脚本:在 SQL Server 中查找未使用的数据库表 下面是文章中的脚本,我将表类型“U”更改为存储过程类型“P”: