dbms_proleer PL / SQL 성능 조정
7737 단어 DBMS 패키지
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