from http://blog.chinaunix.net/uid-20276781-id-1711502.html
dbms_profiler用来测试PL/SQL代码非常有用,比如找出哪一段代码比较耗时,也可以用来比较不同算法之间的差异。
1.配置dbms_profiler的运行环境
SQL> conn / as sysdba
已连接。
SQL> @?\rdbms\admin\profload.sql
程序包已创建。
授权成功。
同义词已创建。
库已创建。
程序包主体已创建。
Testing for correct installation
SYS.DBMS_PROFILER successfully loaded.
PL/SQL 过程已成功完成。
SQL> @?\rdbms\admin\proftab.sql
drop table plsql_profiler_data cascade constraints
*
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在
drop table plsql_profiler_units cascade constraints
*
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在
drop table plsql_profiler_runs cascade constraints
*
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在
drop sequence plsql_profiler_runnumber
*
ERROR 位于第 1 行:
ORA-02289: 序列(号)不存在
表已创建。
注释已创建。
表已创建。
注释已创建。
表已创建。
注释已创建。
序列已创建。
SQL> @?\plsql\demo\profrep.sql
视图已建立。
视图已建立。
视图已建立。
视图已建立。
程序包已创建。
没有错误。
程序包主体已创建。
没有错误。
SQL>
2.使用dbms_profiler
e.g.:
begin
dbms_profiler.start_profiler( 'mod' );
for i in 1 .. 500000
loop
cnt := cnt + 1;
if ( mod(cnt,1000) = 0 )
then
commit;
end if;
end loop;
dbms_profiler.stop_profiler;
end;
/
begin
dbms_profiler.start_profiler( 'no mod' );
for i in 1 .. 500000
loop
cnt := cnt + 1;
if ( cnt = 1000 )
then
commit;
cnt := 0;
end if;
end loop;
dbms_profiler.stop_profiler;
end;
/
然后执行:
SQL> conn
scott/tiger@db01
已连接。
SQL> exec no_mod
PL/SQL 过程已成功完成。
SQL> exec do_mod
PL/SQL 过程已成功完成。
3.生成Report
Oracle自带的
profsum.sql比较耗时,可以使用tom修改过的
profsum.sql脚本来生成Report。
Oracle自带的
profsum.sql脚本产生的
Report比Tom的
profsum.sql脚本所产生的
Report详细,具体的结果请查看示例。
每次执行profsum.sql脚本之前,需要把旧的数据删除:
truncate table plsql_profiler_data;
truncate table plsql_profiler_units;
truncate table plsql_profiler_runs;