Oracle 11g에서 대기 이벤트가 포함된 10046 진단 이벤트를 실행하는 방법을 정리해봤습니다.
1. 전통적인 10046 진단 이벤트 사용법은 다음과 같습니다. 레벨 8 이상이면 대기 이벤트가 기록됩니다.
1 |
alter session set events '10046 trace name context forever, level 8' ; |
3 |
select /* 10046 */ count (*) from user_objects; |
5 |
alter session set events '10046 trace name context off' ; |
2. 11g에서는 다음과 같이 sql_trace라는 "인식 가능한" 이름의 진단 이벤트를 사용할 수 있습니다.
02 |
alter session set events 'sql_trace level 8' ; |
04 |
select /* sql_trace_1 */ count (*) from user_objects; |
06 |
alter session set events 'sql_trace off' ; |
09 |
alter session set events 'sql_trace wait=true' ; |
11 |
select /* sql_trace_2 */ count (*) from user_objects; |
13 |
alter session set events 'sql_trace off' ; |
16 |
alter session set events 'sql_trace wait=true, bind=true' ; |
18 |
select /* sql_trace_3 */ count (*) from user_objects; |
20 |
alter session set events 'sql_trace off' ; |
11g에서 추가된 새로운 진단 이베트 기능은 매우 강력해서 아래와 같이 SQL을 지정할 수도 있습니다. 너무나 유용한 기능이죠.
02 |
select /* sql_trace_4 */ count (*) from user_objects; |
03 |
select /* sql_trace_5 */ count (*) from user_objects; |
05 |
col sql_id new_value sql_id1 |
08 |
where sql_text = 'select /* sql_trace_4 */ count(*) from user_objects' ; |
10 |
col sql_id new_value sql_id2 |
13 |
where sql_text = 'select /* sql_trace_5 */ count(*) from user_objects' ; |
16 |
alter session set events 'sql_trace [sql: &sql_id1] wait=true' ; |
17 |
select /* sql_trace_4 */ count (*) from user_objects; |
18 |
select /* sql_trace_5 */ count (*) from user_objects; |
19 |
alter session set events 'sql_trace off' ; |
22 |
alter session set events 'sql_trace [sql: &sql_id1 | &sql_id2] wait=true' ; |
23 |
select /* sql_trace_4 */ count (*) from user_objects; |
24 |
select /* sql_trace_5 */ count (*) from user_objects; |
25 |
alter session set events 'sql_trace off' ; |
3. DBMS_MONITOR 패키지가 오라클이 공식적으로 추천하는 방법입니다. DBMS_MONITOR 패키지에서도 SQL을 특정할 수 있는 기능이 제공된다면 좋겠지만 개발자들이 아직 거기까지는 고려하지 못한 것 같습니다.
1 |
exec dbms_monitor.session_trace_enable(waits=> true ); |
3 |
select /* dbms_monitor */ count (*) from user_objects; |
5 |
exec dbms_monitor.session_trace_disable; |
4. DBMS_SYSTEM 패키지나 DBMS_SUPPORT 패키지같은 히든 패키지에서도 비슷한 기능을 제공합니다만, DBMS_MONITOR 패키지가 등장한 이상 필요가 없어졌죠.
02 |
col serial# new_value se |
05 |
where sid = userenv( 'sid' ); |
07 |
exec sys.dbms_system.set_ev(&sid, &se, 10046, 8, null ); |
09 |
select /* dbms_system */ count (*) from user_objects; |
11 |
exec sys.dbms_system.set_ev(&sid, &se, 10046, 0, null ); |
SQL_ID 값을 이용해서 특정 SQL에 대해서만 진단 이벤트를 수행할 수 있는 기능이 특히 유용해보입니다. 오라클 11g의 확장된 진단 이벤트 기능은 아래 문서에 자세히 소개되어 있습니다.
출처 : 조동욱님 티스토리