在公司内部有时候会给其它的同事进行一些内部的培训,这里大部分的同事都在用PL/SQL写程序,因此关于PL/SQL程序的性能调整是很多人关心的话题。
对于一大段PL/SQL程序,如何快速找到这段程序里面最耗费时间的部分在哪里?如何快速地定位改程序的bottleneck?这时候需要dbms_profiler包。
1. 首先需要检查dbms_profiler包有没有安装。如果没有则需要通过sys用户运行$ORACLE_HOME/admin/profload.sql来创建该包。
2. 将该包的执行权限赋予待优化的PL/SQL程序属主。
3. 使用PL/SQL程序属主登录数据库,运行$ORACLE_HOME/rdbms/admin/proftab.sql来创建repository tables,包含PLSQL_PROFILER_RUNS,PLSQL_PROFILER_UNITS,PLSQL_PROFILER_DATA这三张表。
4. 在待优化的PL/SQL程序前后加上运行dbms_profiler包的代码,如下:
BEGIN
DBMS_PROFILER.START_PROFILER('any comment');
...'your pl/sql code'
DBMS_PROFILER.STOP_PROFILER;
...
END;
/
5. 运行该PL/SQL程序,之后检查PLSQL_PROFILER_DATA表内容,从中就可以看到每一行代码的执行次数,每行代码总共的执行时间。
另外从Metalink上Note:243755.1中可以下载PROF.zip,包含的程序可以用来生成直观的profiler结果报告,一个html样式的报告。
![]() |
该报告可以列出Top 10最消耗时间的代码,强烈推荐使用。