如何可靠地跟踪存储过程(和函数)随时间的使用情况?

Iva*_*anP 6 sql-server-2008 sql-server

我在数据库中有很多存储过程和函数,很多都不再使用了,我想删除它们。我怎样才能可靠地找到它们?

我已经看到建议查看计划缓存的答案。这是一个很好的开始,但需要注意的是,保留这些计划涉及许多因素。那些因素是什么?我不想仅仅因为计划缓存丢失而删除函数的过程(例如:选项是否重新编译删除计划?)。

我还考虑过使用探查器(运行 2 个月听起来不是一个好主意),或者甚至制作一些脚本来更改所有正在使用的过程(尽管这对函数没有帮助)。

如果无法通过这种方式找到它们,还有其他方式吗?除了 profiler 之外,您还知道其他任何工具吗?(日志分析会太慢,因为我需要超过 2 个月的数据)。

我需要这些数据尽可能可靠。

Mik*_*Fal 5

我会创建一个轮询作业和审计表来跟踪这些信息,就像我目前在我的环境中使用空间一样。这看起来相当简单,并且不会像运行连续跟踪那样产生大的影响。虽然您的轮询频率在很大程度上取决于您的过程缓存流失,但即使每隔几分钟执行一次快照也是相当轻量级的。

审计表

CREATE TABLE sproc_tracking
(sproc_name sysname
,last_execution_time datetime
,CONSTRAINT pk_sproc_tracking PRIMARY KEY CLUSTERED (sproc_name));
Run Code Online (Sandbox Code Playgroud)

审计 MERGE 语句(因为我们在谈论 SQL 2008,所以可用)

MERGE INTO sproc_tracking
USING (SELECT p.name, max(ps.last_execution_time) last_time
    FROM sys.dm_exec_procedure_stats ps
    JOIN sys.procedures AS p ON (ps.object_id = p.object_id)
    GROUP BY p.name
) AS sproc_stats(name,last_execution_time)
ON (sproc_stats.name = sproc_tracking.sproc_name)
WHEN MATCHED THEN
    UPDATE SET last_execution_time=sproc_stats.last_execution_time
WHEN NOT MATCHED THEN
    INSERT (sproc_name,last_execution_time)
    VALUES (sproc_stats.name,sproc_stats.last_execution_time);
Run Code Online (Sandbox Code Playgroud)

创建表后,我会将审计语句放在 SQL 代理作业中,以便根据缓存流失定期执行。如果您的系统相当活跃,那么每 15 分钟可能是一个不错的起点。

陷阱

  • 由于这仍然基于过程缓存,因此无论如何WITH RECOMPILE都不会收集创建的任何存储过程。
  • 此过程需要在您的特定数据库的上下文中执行/收集。如果您需要多个数据库,则需要调整该过程以在整个服务器的每个数据库中执行。有多种方法可以做到这一点。


小智 1

SELECT p.name, s.last_execution_time
    FROM sys.dm_exec_procedure_stats AS s
    INNER JOIN sys.procedures AS p
        ON s.[object_id] = p.[object_id]
    ORDER BY s.last_execution_time desc;
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,这仅涵盖缓存的存储过程。如果您的程序仅每月甚至每周运行,它们很可能不会出现。一周检查几次,然后在月底/月初检查几次。 (5认同)