使用dbms_profiler測試儲存過程效能

sky850623發表於2015-01-10
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部落格 ” ,連結:http://blog.itpub.net/26937943/viewspace-1397250/,如需轉載,請註明出處,否則將追究法律責任。

相關文章