|
本帖最后由 samt007 于 2017-3-27 09:42 编辑
我想到的有2个办法:
首先,第一个办法是版主介绍的这个DBMS_PROFILE包。
下面是使用实例:
- --DBMS_PROFILE對PL/SQL的執行跟蹤
- DECLARE
- err NUMBER;
- BEGIN
- err :=DBMS_PROFILER.start_profiler(TO_CHAR(SYSDATE,'YYYY-MM-DD
- HH24:MI:SS'));
- -- You need to test procedure
- --429, WBJ1F-BLFC, WBJ1F-HX, WBJ1F-WL, WBJ1X-XSYL, , , , 2011/06/01 00:00:00, 2011/06/06 23:59:59,
- err :=DBMS_PROFILER.stop_profiler;
- END;
- SELECT p.unit_name,p.occured,p.tot_time,p.line# line,
- SUBSTR(s.text,1,75) text
- FROM (SELECT u.unit_name,d.total_occur occured,u.unit_type TYPE,
- (d.total_time/1000000000) tot_time,d.line#
- FROM plsql_profiler_units u,plsql_profiler_data d
- WHERE d.runid=u.runid
- AND d.unit_number=u.unit_number
- AND d.total_occur>0) p ,
- user_source s
- WHERE p.unit_name=s.NAME(+)
- AND p.line#=s.line(+)
- AND p.TYPE=s.TYPE(+)
- AND p.unit_name='your sp name'
- ORDER BY p.unit_name,p.line#;
复制代码
第二个办法是利用Monitor来跟踪。
首先在会话层启用Monitor跟踪。这个必须要做!否则monitor只可以监控单条SQL的执行时间6秒以上的SQL语句。
接着,在该会话执行您的存储过程。
执行完毕之后,再查询V$SQL_MONITOR视图(注意要查询当前SID的监控情况),分析SQL的执行情况即可。看哪个SQL_ID的总执行的时间最长即可。
老实说,如果只是分析存储过程的SQL执行效率问题,个人比较建议用这个办法~前提你的数据库版本要11g以上。
如果重点是要分析存储过程的逻辑处理问题(举个例子,你的存储过程不小心写了一个死循环,或者循环没退出,执行肯定是直接卡死!那这个办法可能无法监控了),那用DBMS_PROFILE包会更好。
----
关于11g的SQL监控功能介绍可以看这个链接:http://blog.csdn.net/zengmuansha/article/details/23296613
关于第二个监控的办法,我找时间可以写个实例出来,方便你们使用。
|
|