Iva*_*anP 6 sql-server-2008 sql-server
我在数据库中有很多存储过程和函数,很多都不再使用了,我想删除它们。我怎样才能可靠地找到它们?
我已经看到建议查看计划缓存的答案。这是一个很好的开始,但需要注意的是,保留这些计划涉及许多因素。那些因素是什么?我不想仅仅因为计划缓存丢失而删除函数的过程(例如:选项是否重新编译删除计划?)。
我还考虑过使用探查器(运行 2 个月听起来不是一个好主意),或者甚至制作一些脚本来更改所有正在使用的过程(尽管这对函数没有帮助)。
如果无法通过这种方式找到它们,还有其他方式吗?除了 profiler 之外,您还知道其他任何工具吗?(日志分析会太慢,因为我需要超过 2 个月的数据)。
我需要这些数据尽可能可靠。
我会创建一个轮询作业和审计表来跟踪这些信息,就像我目前在我的环境中使用空间一样。这看起来相当简单,并且不会像运行连续跟踪那样产生大的影响。虽然您的轮询频率在很大程度上取决于您的过程缓存流失,但即使每隔几分钟执行一次快照也是相当轻量级的。
审计表
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)
归档时间: |
|
查看次数: |
2524 次 |
最近记录: |