在进行数据库调 优时,代码的性能瓶颈至关重要,Oracle数据库提供的DBMS_PROFILER包可以特别方便的发现瓶颈的所在之处。
DBMS_PROFILER在使用之前可能需要安装,具体安 装步骤如下:
◆1:执行$ORACLE_HOME/rdbms/admin /profload.sql
◆2:创建一个用于存放跟踪信息的schema
CREATE USER profiler IDENTIFIED BY profiler DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
GRANT connect TO profiler;
GRANT CREATE ANY SYNONYM TO PROFILER;
GRANT CREATE SEQUENCE TO PROFILER;
grant create any table to profiler;
CREATE PUBLIC SYNONYM plsql_profiler_runs FOR profiler.plsql_profiler_runs;
CREATE PUBLIC SYNONYM plsql_profiler_units FOR profiler.plsql_profiler_units;
CREATE PUBLIC SYNONYM plsql_profiler_data FOR profiler.plsql_profiler_data;
CREATE PUBLIC SYNONYM plsql_profiler_runnumber FOR profiler.plsql_profiler_runnumber;
◆3:使用刚刚创建的profiler用户执行如下脚本或代码:
$ORACLE_HOME/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_units TO PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE ON plsql_profiler_runs TO PUBLIC;
安装成功后测试:
执行
BEGIN
DBMS_PROFILER.START_PROFILER('123');
FOR I IN 1 .. 1000 LOOP
INSERT INTO A VALUES (I);
END LOOP;
COMMIT;
DBMS_PROFILER.STOP_PROFILER();
END;
执行后使用下面的代码检查:
SELECT C.LINE#, C.TOTAL_OCCUR, C.TOTAL_TIME, C.MIN_TIME, C.MAX_TIME
FROM PLSQL_PROFILER_RUNS A, PLSQL_PROFILER_UNITS B, PLSQL_PROFILER_DATA C
WHERE A.RUN_COMMENT = ’123′
--AND B.UNIT_OWNER = ''
AND A.RUNID = B.RUNID
AND A.RUNID = C.RUNID
AND B.UNIT_NUMBER = C.UNIT_NUMBER
注意:每次DBMS_PROFILER.START_PROFILER的输入 参数需要改变,否则便不能分别运行后的运行结果了。
除此之外B.UNIT_OWNER =‘’中的约束值如果是在package里面需要是包名,如果是procedure则是procedure的名字。实在在不知道什么名字时可以在 PLSQL_PROFILER_UNITS中查一下。
此外,运行结果可以通过PLSQL Developer来观察,需要新建一个test,在profiler中可以查看它的运行结果.
另外从Metalink上Note:243755.1中 可以下载PROF.zip,包含的程序可以用来生成直观的profiler结果报告,一个html样式的报告。
该报告可以列出Top 10最消耗时间的代码,强烈推荐使用。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22521389/viewspace-756475/ ,如需转载,请注明出处,否则将追究法律责任。