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
相关产品推荐
相关产品推荐

