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

Oracle 19c中如何查询所有视图与存储过程的实际执行时间?

Oracle 19c 查询视图与存储过程实际执行时间的可行方法

针对你需要获取视图和存储过程实际执行时间(避开缓存影响)的需求,以下是几种实用的方法,适用于Oracle 19c环境:

1. 使用DBMS_PROFILER分析执行耗时

这个工具能精准追踪PL/SQL对象(存储过程、函数)以及视图底层SQL的执行时间,适合批量或单个对象的性能分析:

-- 启动Profiler会话
EXEC DBMS_PROFILER.START_PROFILER('OBJECT_PERF_ANALYSIS');

-- 执行目标对象:存储过程直接调用,视图通过SELECT执行
EXEC your_target_procedure;
SELECT * FROM your_target_view;

-- 停止Profiler
EXEC DBMS_PROFILER.STOP_PROFILER;

-- 查询执行时间统计(total_time单位为微秒)
SELECT 
    p.runid,
    TO_CHAR(p.run_date, 'YYYY-MM-DD HH24:MI:SS') run_time,
    u.unit_name object_name,
    u.total_time / 1000000 elapsed_secs
FROM plsql_profiler_runs p
JOIN plsql_profiler_units u ON p.runid = u.runid
WHERE u.unit_name IN ('YOUR_TARGET_PROCEDURE', 'YOUR_TARGET_VIEW')
ORDER BY elapsed_secs DESC;

如果要模拟首次执行,先执行ALTER SYSTEM FLUSH SHARED_POOL;和ALTER SYSTEM FLUSH BUFFER_CACHE;清空缓存(需DBA权限)。

2. 用DBMS_HPROF做层次化性能分析

如果需要更细致的执行步骤耗时拆解(比如视图底层每个SQL语句的耗时),可以用层次化Profiler:

-- 创建存储报告的目录(需DBA协助创建或授权)
CREATE DIRECTORY hprof_output AS '/path/to/your/directory';
GRANT READ, WRITE ON DIRECTORY hprof_output TO your_user;

-- 启动HPROF分析
EXEC DBMS_HPROF.START_PROFILING('HPROF_OUTPUT', 'object_perf_trace.txt');

-- 执行目标对象
EXEC your_target_procedure;
SELECT * FROM your_target_view;

-- 停止分析并生成报告
EXEC DBMS_HPROF.STOP_PROFILING;
EXEC DBMS_HPROF.ANALYZE('HPROF_OUTPUT', 'object_perf_trace.txt', 'HPROF_OUTPUT', 'object_perf_report.txt');

生成的文本报告会详细列出每个执行阶段的耗时,方便定位性能瓶颈。

3. 清空缓存后手动测试单个视图

如果只是快速验证单个视图的首次执行耗时,可直接清空缓存后开启计时:

-- 清空共享池和缓冲区缓存(需DBA权限)
ALTER SYSTEM FLUSH SHARED_POOL;
ALTER SYSTEM FLUSH BUFFER_CACHE;

-- 开启计时并执行视图
SET TIMING ON;
SELECT * FROM your_target_view;
SET TIMING OFF;

SQL Developer或SQL*Plus会直接显示实际执行时间,结果不受缓存影响。

4. 查询AWR获取历史执行统计

若要查看对象的长期执行性能趋势(平均耗时、最大耗时),可以查询AWR的历史统计视图:

SELECT
    sql_id,
    SUBSTR(sql_text, 1, 100) sql_text,
    elapsed_time / 1000000 total_elapsed_secs,
    executions,
    (elapsed_time / executions) / 1000000 avg_elapsed_secs
FROM dba_hist_sqlstat
WHERE 
    (sql_text LIKE '%your_target_view%' AND sql_text NOT LIKE '%SELECT * FROM dba_hist_sqlstat%')
    OR sql_text LIKE '%your_target_procedure%'
ORDER BY avg_elapsed_secs DESC;

这里的avg_elapsed_secs是平均执行秒数,能反映对象的整体性能表现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:50:24