You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取PL/SQL包中各存储过程与函数的执行耗时

在PL/SQL包中获取存储过程与函数的执行时间

下面是几种实用的方法,可根据你的需求选择:

1. 手动添加计时逻辑(简单直接)

直接在每个存储过程/函数的首尾加入时间记录代码,计算执行耗时。适合小范围测试,无需额外工具。

示例代码:

CREATE OR REPLACE PACKAGE BODY my_package IS
    PROCEDURE my_proc IS
        l_start NUMBER;
        l_elapsed NUMBER;
    BEGIN
        -- 记录开始时间(DBMS_UTILITY.GET_TIME返回百分之一秒为单位的数值)
        l_start := DBMS_UTILITY.GET_TIME;
        
        -- 你的业务逻辑
        NULL;
        
        -- 计算并输出耗时(转换为秒)
        l_elapsed := (DBMS_UTILITY.GET_TIME - l_start) / 100;
        DBMS_OUTPUT.PUT_LINE('my_proc 执行耗时: ' || l_elapsed || ' 秒');
        -- 也可以将结果插入自定义日志表持久化
        -- INSERT INTO exec_log (proc_name, elapsed_sec) VALUES ('my_proc', l_elapsed);
    END my_proc;

    FUNCTION my_func RETURN NUMBER IS
        l_start TIMESTAMP;
        l_elapsed INTERVAL DAY TO SECOND;
        l_result NUMBER;
    BEGIN
        l_start := SYSTIMESTAMP;
        
        -- 你的函数逻辑
        l_result := 100 * 200;
        
        l_elapsed := SYSTIMESTAMP - l_start;
        DBMS_OUTPUT.PUT_LINE('my_func 执行耗时: ' || l_elapsed);
        RETURN l_result;
    END my_func;
END my_package;

2. 使用PL/SQL Profiler(无需修改包代码)

Oracle自带的PL/SQL剖析器可以收集程序单元的执行统计信息,包括每个存储过程/函数的总执行时间、调用次数等,无需修改原有包代码。

步骤示例:

-- 1. 启动剖析器
DECLARE
    l_run_id NUMBER;
BEGIN
    DBMS_PROFILER.START_PROFILER('包执行性能分析', l_run_id);
    -- 调用包内的程序单元
    my_package.my_proc;
    DBMS_OUTPUT.PUT_LINE('my_func 返回值: ' || my_package.my_func);
    DBMS_PROFILER.STOP_PROFILER;
END;
/

-- 2. 查询执行时间统计
SELECT
    pu.unit_name AS 程序单元名称,
    SUM(pd.total_time) / 1000000000 AS 总执行时间_秒
FROM
    PLSQL_PROFILER_RUNS pr
JOIN
    PLSQL_PROFILER_UNITS pu ON pr.runid = pu.runid
JOIN
    PLSQL_PROFILER_DATA pd ON pu.runid = pd.runid AND pu.unit_number = pd.unit_number
WHERE
    pr.run_comment = '包执行性能分析'
GROUP BY
    pu.unit_name;

注意:需要拥有EXECUTE ON DBMS_PROFILER权限,且相关分析视图(PLSQL_PROFILER_*)需存在。

3. 使用SQL Trace + TKPROF(结合SQL语句分析)

通过SQL Trace生成跟踪文件,再用TKPROF工具分析,可同时获取PL/SQL单元和内部SQL语句的执行时间,适合深度性能调优。

步骤示例:

-- 1. 启用SQL Trace
ALTER SESSION SET SQL_TRACE=TRUE;

-- 2. 执行包内程序单元
EXEC my_package.my_proc;
SELECT my_package.my_func FROM DUAL;

-- 3. 关闭SQL Trace
ALTER SESSION SET SQL_TRACE=FALSE;

然后找到Oracle生成的跟踪文件(默认在user_dump_dest目录下),用TKPROF工具解析:

tkprof your_trace_file.trc output_report.txt explain=your_username/your_password

在生成的output_report.txt中,可找到每个PL/SQL单元的执行耗时、调用次数等详细信息。

4. 使用DBMS_HPROF(分层剖析,可视化报告)

Oracle 11g及以上的分层剖析器,能生成带调用栈的性能报告,支持输出HTML格式,直观展示程序单元的调用关系和执行时间占比。

步骤示例:

-- 1. 创建存放报告的目录(需替换为实际路径)
CREATE DIRECTORY hprof_dir AS '/opt/oracle/hprof_reports';
GRANT READ, WRITE ON DIRECTORY hprof_dir TO your_user;

-- 2. 启动分层剖析
DECLARE
    l_run_id NUMBER;
BEGIN
    DBMS_HPROF.START_PROFILING('HPROF_DIR', 'package_perf.trc');
    my_package.my_proc;
    DBMS_OUTPUT.PUT_LINE('my_func 返回值: ' || my_package.my_func);
    DBMS_HPROF.STOP_PROFILING;
END;
/

-- 3. 生成HTML报告
DECLARE
    l_report CLOB;
BEGIN
    l_report := DBMS_HPROF.ANALYZE('HPROF_DIR', 'package_perf.trc', 'HPROF_DIR', 'package_perf_report.html');
END;
/

打开生成的HTML报告,可清晰看到每个存储过程/函数的执行耗时、调用层级等信息。

内容的提问来源于stack exchange,提问作者Golu Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:45:35