暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 性能篇系列-存储过程性能查看

码蚁在线 2017-07-04
1550

       

        在工作中,不乏会出现业务相对复杂,很多时候都是通过存储过程来实现对应的业务逻辑,从而在调用存储过程中,出现运行时间长,无法定位到存储过程中哪条SQL语句导致。因此,提出Oracle自带的DBMS_PROFILER分享,便于大家能够结合自己工作中的业务需求写的存储过程使用DBMS_PROFILER来进行分析,高效找出消耗性能的语句的位置,处理存储过程中导致瓶颈的语句。


DBMS_PROFILER涉及表格

一句话,以个人的理解,就是能够快速定位到代码的性能评价在哪里。先提供DBMS_PROFILER使用中涉及的表格:

plsql_profiler_runs        --prof运行信息
plsql_profiler_units        --prof每个单元信息
plsql_profiler_data        --prof每个单元的详细数据

实现操作

1.操作环境

登录用户:sys/oracle

查看数据库版本:select * from v$version;


2.相关脚本执行,授权

核实是否按照dbms_profiler包

desc dbms_profiler;


授权并生成需要的表格:
grant execute on dbms_profiler to scott;
@C:/oracle/product/10.2.0/db_1/RDBMS/ADMIN/proftab.sql

生成的表格:
SELECT * FROM PLSQL_PROFILER_RUNS;
SELECT * FROM PLSQL_PROFILER_UNITS;
SELECT * FROM PLSQL_PROFILER_DATA


3.创建一个测试过程,包含dbms_profiler包文件,并执行

create or replace procedure p_dbms_profiler_test
 is
 i number :=1 ;
 v_str varchar2(4000);
begin
  dbms_profiler.start_profiler('测试一下');
  dbms_output.put_line(i);
  for i in 1..100 loop
   exit when length(v_str)>100;
    v_str := v_str||i;
  end loop;
  dbms_output.put_line(v_str);
  dbms_profiler.stop_profiler;
end p_dbms_profiler_test;
执行过程:


4.查询数据

--获得本次prof的基本运行信息:
select * from plsql_profiler_runs where run_comment='测试一下';
--根据运行号和单元名(即测试的存储过程名)获得本次prof的单元信息:
select * from plsql_profiler_units where runid=1 and unit_name='P_DBMS_PROFILER_TEST';        
--根据运行号和单元号获得该存储过程每行运行的统计信息:
select * from plsql_profiler_data where runid =1 and unit_number=1;
 
最终关联查看:
SELECT   d.line#,                 --代码行号
    s.text,                         --源代码
       d.total_time,                   --总共运行时间(单位10000亿分之一秒)
       d.total_occur,                  --总共运行次数
       d.min_time,                     --最小运行时间
       d.max_time                      --最大运行时间           
    FROM   plsql_profiler_data d, sys.all_source s, plsql_profiler_units u
   WHERE       d.runid = 1           --运行号
    and u.unit_name = 'P_DBMS_PROFILER_TEST'        --单元名,即被测试的存储过程名
       AND u.runid = d.runid
    AND d.unit_number = u.unit_number
    AND d.total_occur <> 0
    AND s.TYPE(+) = u.unit_type
    AND s.owner(+) = u.unit_owner
    AND s.name(+) = u.unit_name
    AND d.line# = NVL (s.line, d.line#)
   ORDER BY   u.unit_number, d.line#;
对应结果:


DBMS_PROFILER在PLSQL上使用

1.通过存储过程打开一个test窗口


2.通过存储过程打开一个test窗口



3.切换到Profiler窗口查

PLSQL上Profiler页签上按钮讲解
显示配置对话框
刷新
删除并运行
Run 显示当前的系统的所有Profiler列表,缺省为当前的跟踪
Unit 显示本次跟踪的单元列表信息(执行时间),缺省为所有单元的执行时间

文章转载自码蚁在线,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论