dbms_proleer PL / SQL 성능 조정

7737 단어 DBMS 패키지
1、DBMS_PROFILER 소개
PL / SQL 에 대한 추적 이 필요 하 다 면 가장 오래 걸 리 는 구문 블록 을 찾 아 Oacle 이 제공 하 는 DBMS 를 사용 할 수 있 습 니 다.PROFILER 추적.
DBMS 검사PROFILER 패키지 설치 여부sys@ORCL> desc dbms_profiler
설치 되 어 있 지 않 으 면 $ORACLE 를 실행 할 수 있 습 니 다.HOME/rdbms/admin/profload.sql  스 크 립 트 설치
기본적으로 DBMSPROFILER 패키지 가 설치 되 어 있 지만 어떤 schema 에서 dbms 를 사용 하려 고 합 니 다.proffler, 해당 시 계 를 만들어 야 합 니 다.
sql 은 $ORACLEHOME / rdbms / admin / proftab. sql 을 실행 하면 됩 니 다.
2、DBMS_PROFILER 설치
desc dbms_profiler 는 dbms 를 볼 수 있 습 니 다.proffler 패키지 가 설치 되 어 있 으 며 추적 정 보 를 저장 하 는 사용자 와 prof 표 와 시퀀스 의 동의어 를 만 듭 니 다.
sys@ORCL> CREATE USER profiler IDENTIFIED BY profiler;

     。

sys@ORCL> grant connect,resource to profiler;

    。

sys@ORCL> CREATE PUBLIC SYNONYM plsql_profiler_runs FOR profiler.plsql_profiler_runs;

      。

sys@ORCL> CREATE PUBLIC SYNONYM plsql_profiler_units FOR profiler.plsql_profiler_units;

      。

sys@ORCL> CREATE PUBLIC SYNONYM plsql_profiler_data FOR profiler.plsql_profiler_data;

      。

sys@ORCL> CREATE PUBLIC SYNONYM plsql_profiler_runnumber FOR profiler.plsql_profiler_runnumber;

      。

proffler 사용자 로 prof 표 와 시퀀스 를 만 들 고 권한 을 부여 합 니 다.
sys@ORCL> conn profiler/profiler
   。
profiler@ORCL> @?/rdbms/admin/proftab.sql
... ...

profiler@ORCL> GRANT SELECT ON plsql_profiler_runnumber TO PUBLIC;

    。

profiler@ORCL> GRANT SELECT,INSERT,UPDATE,DELETE ON plsql_profiler_data TO PUBLIC;

    。

profiler@ORCL> GRANT SELECT,INSERT,UPDATE,DELETE ON plsql_profiler_units TO PUBLIC;

    。

profiler@ORCL> GRANT SELECT,INSERT,UPDATE,DELETE ON plsql_profiler_runs TO PUBLIC;

    。

비고:
plsql_profiler_runs        --prof 실행 정보
plsql_profiler_units        --prof 각 단원 정보
plsql_profiler_data        --prof 각 단원 의 상세 한 데이터
plsql_profiler_runnumber    --prof 의 유일한 실행 번 호 를 만 드 는 시퀀스
profiler@ORCL> select o.OBJECT_NAME,o.OBJECT_TYPE from user_objects o order by o.OBJECT_TYPE
  2  /

OBJECT_NAME                    OBJECT_TYPE
------------------------------ -------------------
SYS_C0023499                   INDEX
SYS_C0023502                   INDEX
SYS_C0023497                   INDEX
PLSQL_PROFILER_RUNNUMBER       SEQUENCE
PLSQL_PROFILER_UNITS           TABLE
PLSQL_PROFILER_DATA            TABLE
PLSQL_PROFILER_RUNS            TABLE

   7 。

오래된 데이터 확인:
delete from profiler.plsql_profiler_data; delete from profiler.plsql_profiler_units; delete from profiler.plsql_profiler_runs;
3. 인 스 턴 스 적용
u1@ORCL> conn u1/u1
   。
u1@ORCL>  create table tab_test (a int);

    。

u1@ORCL> CREATE OR REPLACE PROCEDURE sp_test AS
  2  BEGIN
  3    FOR I IN 1 .. 100000 LOOP
  4      INSERT INTO tab_test VALUES (I);
  5    END LOOP;
  6    COMMIT;
  7  END;
  8  /

     。

u1@ORCL> DECLARE
  2    v_run_number integer;
  3  BEGIN
  4    --  profiler
  5    sys.DBMS_PROFILER.start_profiler(run_number => v_run_number);
  6    --           (      )
  7    DBMS_OUTPUT.put_line('run_number:' || v_run_number);
  8    sp_test;   PLSQL
  --      PLSQL
  9    sp_test;
 10    --  profiler
 11    sys.DBMS_PROFILER.stop_profiler;
 12  END;
 13  /
run_number:2

PL/SQL        。
--    prof       :
u1@ORCL> select runid,run_owner,run_date,run_total_time from plsql_profiler_runs where runid = 2;

     RUNID RUN_OWNER                        RUN_DATE            RUN_TOTAL_TIME
---------- -------------------------------- ------------------- --------------
         2 U1                               2014-01-19 19:37:47      130000000

--         (         )    prof     :
u1@ORCL> select unit_number,unit_type,unit_owner,unit_name,unit_timestamp,total_time from plsql_profiler_units where runid = 2 and unit_name = 'SP_TEST';

UNIT_NUMBER UNIT_TYPE       UNIT_OWNER UNIT_NAME       UNIT_TIMESTAMP      TOTAL_TIME
----------- --------------- ---------- --------------- ------------------- ----------
          2 PROCEDURE       U1         SP_TEST         2014-01-19 19:35:23          0

--                     :
u1@ORCL> select runid,unit_number,line#,total_occur,total_time,min_time,max_time from plsql_profiler_data where runid = 2;

     RUNID UNIT_NUMBER      LINE# TOTAL_OCCUR TOTAL_TIME   MIN_TIME   MAX_TIME
---------- ----------- ---------- ----------- ---------- ---------- ----------
         2           1          1           0          0          0          0
         2           1          5           0       4080       4080       4080
         2           1          7           1      77535      77535      77535
         2           1          9           2      32646       2040      30606
         2           1         11           1       3060       3060       3060
         2           1         12           0          0          0          0
         2           2          1           0       3060       3060       3060
         2           2          3         101     136707       1020       2040
         2           2          4         100   11547733      49990    5504021
         2           2          6           1     106101     106101     106101
         2           2          7           1       3060       3060       3060

   11 。

상기 정 보 는 직관 적 이지 않 고 아래 의 sql 을 통 해 더욱 직관 적 으로 보 여 줍 니 다.
u1@ORCL> SELECT d.line#, --    
  2         s.text, --   
  3         round(d.total_time / 1000000000, 2) total_time, --      (   )
  4         d.total_occur, --      
  5         round(d.min_time / 1000000000, 2) min_time, --      
  6         round(d.max_time / 1000000000, 2) max_time --                 
  7    FROM plsql_profiler_data d, sys.all_source s, plsql_profiler_units u
  8   WHERE d.runid = 7 --   
  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
---------- ------------------------------------------------------------ ---------- ----------- ---------- ----------
         1 PROCEDURE sp_test AS                                                  0           1          0          0
         2 BEGIN                                                                 0           1          0          0
         3   FOR I IN 1 .. 100000 LOOP                                         .15      100001          0          0
         4     INSERT INTO tab_test VALUES (I);                               6.38      100000          0        .34
         5   END LOOP;                                                           0           1          0          0
         6   COMMIT;                                                             0           1          0          0
         7 END;                                                                  0           1          0          0

   7 。

더 많은 내용 참고:
DBMS 사용PROFILER 포 지 셔 닝 PL / SQL 병목 코드
http://blog.csdn.net/leshami/article/details/12100235
비교 PL / SQL proffler 분석 결과
http://blog.csdn.net/leshami/article/details/12110195
PL / SQL Developer 를 사용 하여 PL / SQL 코드 분석
http://blog.csdn.net/leshami/article/details/12187115
PL / SQL Profiler 분석 보고서 생 성 html
http://blog.csdn.net/leshami/article/details/12426469

좋은 웹페이지 즐겨찾기