oracle sql tuning 12 --dbms_profiler调整pl/sql

定位存储过程中那一段代码费时,一直是个麻烦事情,DBMS_PROFILER包的出现可以解这个难题,它甚至可以定位每行代码的运行时间!测试了下,记下来

测试环境:

database:  Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

os:  xp

前提:要使用dbms_profiler包,首先要安装这个工具包

1.以sys用户创建dbms_profiler包[先通过desc dbms_profiler来查看包是否已经安装了]

2.如果没有安装,则执行@?/rdbms/admin/profload.sql

3.以SYS用户创建同义词

 

create public synonym plsql_profiler_runs for dbtest.plsql_profiler_runs;
create public synonym plsql_profiler_data for dbtest.plsql_profiler_data;
create public synonym plsql_profiler_units for dbtest.plsql_profiler_units;
create public synonym plsql_profiler_runnumber for dbtest.plsql_profiler_runnumber;

注:这里的dbtest是一个新建测试用户

4.为新建用户dbtest创建相关表和权限

在dbtest用户sqlplus下执行以下语句:

@?/rdbms/admin/proftab.sql

grant select on plsql_profiler_runnumber to public;
grant select,insert,update,delete on plsql_profiler_data to public;
grant select,insert,update,delete on plsql_profiler_runs to public;
grant select,insert,update,delete on plsql_profiler_units to public;

这样就安装完成了

测试:

在dbtest用户sqlplus下运行以下脚本

1.建一个测试过程

create table dbtest1 (a int);
select '生成测试过程用于演示dbms_profiler包的使用' from dual;
create or replace procedure dbms_profiler1
as
begin
 for i in 1..100 loop
  insert into dbtest1 values (i);
 end loop;
 commit;
end;
/

2.用dbms_profiler包来监控这个过程的运行情况

在dbtest,sqlplus中

declare
run_id number;
begin
run_id:=dbms_profiler.start_profiler(to_char(sysdate,'dd-mm-yyyy hh24:mm:ss'));
dbms_output.put_line('run_id'||run_id);
dbms_profiler1;
dbms_profiler.flush_data;
dbms_profiler.stop_profiler;
end;
/

3.对运行结果进行查询

$1.运行的基本信息

15720542_201004162037251.jpg

$2.直观的显示信息

15720542_201004162048421.jpg

这样一下就看出来哪里运行时间较久了,很方便.

但是还有更方便的!那就是在PLSQL工具中直接用test窗口,测试单个过程

例如:

15720542_201004162055211.jpg

然后点击create profiler report按钮,F8运行测试过程即可,最后点击profiler

查看报告结果,如下图:

15720542_201004162059191.jpg

从图中可以清晰看到inset语句执行了100次,耗时6.998秒

 

备用:

 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 =  --运行号
    and u.unit_name = --单元名,即被测试的存储过程名
    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#;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

fj.png4.jpg

fj.png5.jpg

fj.png6.jpg

fj.png7.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15720542/viewspace-659964/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15720542/viewspace-659964/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值