ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle sql tuning 12 --dbms_profiler调整pl/sql

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

原创 Linux操作系统 作者:oracle_db 时间:2010-04-16 19:43:44 0 删除 编辑

定位存储过程中那一段代码费时,一直是个麻烦事情,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.运行的基本信息

$2.直观的显示信息

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

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

例如:

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

查看报告结果,如下图:

从图中可以清晰看到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#;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.jpg

5.jpg

6.jpg

7.jpg

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

请登录后发表评论 登录
全部评论

注册时间:2008-11-13

  • 博文量
    158
  • 访问量
    354236