我想找出存储过程最后一次执行的时间,以便我可以删除未使用的存储过程。一种方法是扫描代码并找出已使用的存储过程列表并删除未使用的存储过程,因为存储过程的数量以千计,我想知道 DB2 中是否有一个选项可以轻松找到它。
2 回答
您没有说您使用的是什么平台或版本的 DB2。
如果您在 DB2 for Linux/UNIX/Windows 上运行并且在 V9.7 或更高版本上,您可以查看 中的LASTUSED
列SYSCAT.PACKAGES
,该列可以SYSCAT.PROCEDURES
通过 连接SYSCAT.ROUTINEDEP
:
select
proc.procschema
,proc.procname
,pkg.lastused
from
syscat.procedures proc
,syscat.routinedep rd
,syscat.packages pkg
where
proc.specificname = rd.routinename
and rd.bname = pkg.pkgname
and pkg.lastused <> '01/01/0001'
order by
pkg.lastused desc;
如果从未执行过某个过程,则 LASTUSED 将具有值“01/01/0001”。上面的查询过滤掉了这些。
另外,请注意,您可能想要过滤,PROCSCHEMA
所以您看不到所有系统存储过程......
如果没有明确的日志记录或跟踪,就不可能为我们数据库的每个存储过程获取此信息。但是,我们可以通过使用 - sys.dm_exec_procedure_stats 获取当前缓存在服务器上的存储过程的此详细信息以及许多其他相关信息。这是一个系统动态视图,可返回缓存存储过程的聚合性能统计信息。
此视图为每个缓存的存储过程计划返回一行,并且该行的生命周期与存储过程保持缓存状态一样长。当从缓存中删除存储过程时,相应的行将从该视图中删除。
USE DBName // replace with your DB name
GO
SELECT
O.name,
PS.last_execution_time
FROM
sys.dm_exec_procedure_stats PS
INNER JOIN sys.objects O
ON O.[object_id] = PS.[object_id]
GO
上面的脚本将返回当前数据库的所有缓存存储过程的名称及其最后执行时间。
更多详情,请查看这里
在 DB2 中,我认为您可以安排存储过程在特定时间、间隔或发生指定事件时运行。管理任务调度程序管理这些请求。
程序
要安排存储过程的执行:
Add a task for the administrative task scheduler by using the ADMIN_TASK_ADD stored procedure. When you add your task, specify which stored procedure to run and when to run it. Use one of the following parameters or groups of parameters of ADMIN_TASK_ADD to control when the stored procedure is run:
间隔 - 存储过程以指定的定期间隔执行。时间点 - 存储过程将在指定时间执行。trigger-task-name - 存储过程将在指定任务发生时执行。trigger-task-name trigger-task-cond trigger-task-code - 存储过程是在指定的任务和任务结果发生时执行。
或者,您还可以使用以下一个或多个参数来控制存储过程何时运行:
begin-timestamp 最早允许执行时间 end-timestamp 最新允许执行时间 max-invocations 最大执行次数
当存储过程运行的指定时间或事件发生时,管理任务调度程序调用 DB2® 中的存储过程。
- 可选:任务执行完成后,使用 ADMIN_TASK_STATUS 函数检查状态。此函数返回一个表,其中一行指示每个计划任务的最后执行状态。如果计划任务是存储过程,则 JOB_ID、MAXRC、COMPLETION_TYPE、SYSTEM_ABENDCD 和 USER_ABENDCD 字段包含空值。在 DB2 错误的情况下,SQLCODE、SQLSTATE、SQLERRMC 和 SQLERRP 字段包含 DB2 通过调用存储过程返回的信息。
有关 ADMIN_TASK_STATUS 的更多信息,请单击此处