定位存储过程中那一段代码费时,一直是个麻烦事情,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#;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15720542/viewspace-659964/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/15720542/viewspace-659964/