1.以sys用户登录执行以下脚本
SQL> conn / as sysdba
已连接。
SQL> @E:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\profload.sql
程序包已创建。
授权成功。
同义词已创建。
库已创建。
程序包体已创建。
Testing for correct installation
SYS.DBMS_PROFILER successfully loaded.
PL/SQL 过程已成功完成。
2.test用户创建一存储过程
SQL> create table tab_test (a int);
表已创建。
SQL> CREATE OR REPLACE PROCEDURE sp_test
2 AS
3 BEGIN
4 FOR I IN 1 .. 100
5 LOOP
6 INSERT INTO tab_test
7 VALUES (I);
8 END LOOP;
9 COMMIT;
10 END;
11 /
在test用户执行以下脚本
SQL> @E:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\proftab.sql
drop table plsql_profiler_data cascade constraints
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
drop table plsql_profiler_units cascade constraints
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
drop table plsql_profiler_runs cascade constraints
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
drop sequence plsql_profiler_runnumber
*
第 1 行出现错误:
ORA-02289: 序列不存在
表已创建。
注释已创建。
表已创建。
注释已创建。
表已创建。
注释已创建。
序列已创建。
过程已创建。
DECLARE
v_run_number integer;
v_temp1 integer;
BEGIN
--启动profiler
DBMS_PROFILER.start_profiler (run_number => v_run_number);
--显示当前跟踪的运行序号(后面查询要用)
DBMS_OUTPUT.put_line ('run_number:' || v_run_number);
--运行要跟踪的PLSQL
sp_test;
--停止profiler
DBMS_PROFILER.stop_profiler;
END;
3.查询结果
SQL> select runid,run_owner,run_date,run_total_time from plsql_profiler_runs;
RUNID RUN_OWNER RUN_DATE RUN_TOTAL_TIME
---------- -------------------------------- -------------- --------------
1 TEST 10-1月 -15 1.0894E+11
2 TEST 10-1月 -15 2.3250E+10
3 TEST 10-1月 -15 4.1350E+10
4 TEST 10-1月 -15 5.9329E+10
SQL> col text format a60
SQL> SELECT d.line#, --代码行号
2 s.text, --源代码
3 d.total_time, --总共运行时间(单位10000亿分之一秒)
4 d.total_occur, --总共运行次数
5 d.min_time, --最小运行时间
6 d.max_time --最大运行时间
7 FROM plsql_profiler_data d, sys.all_source s, plsql_profiler_units u
8 WHERE d.runid = 1 --运行号
9 and u.unit_name = 'SP_TEST' --单元名,即被测试的存储过程名
10 AND u.runid = d.runid
11 AND d.unit_number = u.unit_number
12 AND d.total_occur <> 0
13 AND s.TYPE(+) = u.unit_type
14 AND s.owner(+) = u.unit_owner
15 AND s.name(+) = u.unit_name
16 AND d.line# = NVL (s.line, d.line#)
17 ORDER BY u.unit_number, d.line#;
LINE# TEXT TOTAL_TIME TOTAL_OCCUR MIN_TIME MAX_TIME
---------- ------------------------------------------------------------ ---------- ----------- ---------- ----------
4 FOR I IN 1 .. 100 26505044 101 241371 613485
6 INSERT INTO tab_test 1.4423E+10 100 13279900 9301057816
9 COMMIT; 53914114 1 53914114 53914114
10 END; 886146 1 886146 886146
SQL> select unit_number,unit_type,unit_owner,unit_name,unit_timestamp,total_time from plsql_profiler_units where runid = 1 and unit_name = 'SP_TEST';
UNIT_NUMBER UNIT_TYPE UNIT_OWNER UNIT_NAME UNIT_TIMESTAMP TOTAL_TIME
----------- -------------------------------- -------------------------------- -------------------------------- -------------- ----------
2 PROCEDURE TEST SP_TEST 10-1月 -15 0
SQL> select runid,unit_number,line#,total_occur,total_time,min_time,max_time from plsql_profiler_data where runid = 1 and unit_number = 2;
RUNID UNIT_NUMBER LINE# TOTAL_OCCUR TOTAL_TIME MIN_TIME MAX_TIME
---------- ----------- ---------- ----------- ---------- ---------- ----------
1 2 1 0 1025828 1025828 1025828
1 2 4 101 26505044 241371 613485
1 2 6 100 1.4423E+10 13279900 9301057816
1 2 9 1 53914114 53914114 53914114
1 2 10 1 886146 886146 886146
4.生成html报表
SQL> column RUNID format 99
SQL> column RUN_COMMENT format a30
SQL> @C:\prof\profiler.sql
RUNID RUN_DATE RUN_COMMENT
----- ----------------------- ---------------------------
1 10-1月 -15 15:04:25 10-1月 -15
2 10-1月 -15 15:04:51 10-1月 -15
3 10-1月 -15 16:14:59 10-1月 -15
4 10-1月 -15 16:15:21 10-1月 -15
Usage:
sqlplus apps/
SQL> START profiler.sql
输入 1 的值: 4
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26937943/viewspace-1397250/
,如需转载,请注明出处,否则将追究法律责任。