2011年5月9日月曜日

DBMS_PROFILER使用指南

DBMS_PROFILER使用指南


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;

0 件のコメント:

コメントを投稿