09. ASH(Active Session History)
SQL> select * from v$sgastat where name = 'ASH buffers'; POOL NAME BYTES -- --- shared pool ASH buffers 16252928 |
select sample_id, sample_time --① , session_id, session_serial#, user_id, xid -② , sql_id, sql_child_number, sql_plan_hash_value -③ , session_state ④ , qc_instance_id, gc_session_id ⑤ , blocking_session, blocking_session_serial#, blocking_session_status ⑥ , event, event#, seq#, wait_class, wait_time, time_waited -⑦ , p1text, p1, p2text, p2, p3text, p3 -⑧ , current_obj#, current_file#, current_block# ⑨ , program, module, action, client_id ⑩ from V$ACTIVE_SESSION_HISTORY |
① 샘플링이 일어난 시간과 샘플 ID
② 세션정보, User명, 트랜잭션ID
③ 수행 중 SQL 정보
④ 현재 세션의 상태 정보. 'ON CPU' 또는 'WAITING'
⑤ 병렬 Slave 세션일 때, 쿼리 코디네이터(QC) 정보를 찾을 수 있게 함
⑥ 현재 세션의 진행을 막고 있는(=블로킹) 세션 정보
⑦ 현재 발생 중인 대기 이벤트 정보
⑧ 현재 발생 중인 대기 이벤트의 파라미터 정보
⑨ 해당 세션이 현재 참조하고 있는 오브젝트 정보. V$session 뷰에 있는 row_wait_obj#, row_wait_file#,
row_wait_block# 컬럼을 가져온 것임
⑩ 애플리케이션 정보
column current_obj# format 99999 heading 'CUR_OBJ#' column current_file# format 999 heading 'CUR_FIL#' column current_block# format 999 heading 'CUR_BLK#' select to_char(sample_time, 'hh24:mi:ss') sample_tm, session_state , event, wait_class, current_obj#, current_file#, current_block# from v$active_session_history where session_id = 143 and session_serial# = 9 order by sample_time; |
SAMPLE_T | SESSION | EVENT | WAIT_CLASS | CUR_OBJ# | EUR_FIL# | CUR_CLK# |
15:00:44 | WATING | Enq: TX - row lock contention | Application | 55765 | 4 | 476 |
15:00:45 | WATING | Enq: TX - row lock contention | Application | 55765 | 4 | 476 |
15:00:46 | WATING | Enq: TX - row lock contention | Application | 55765 | 4 | 476 |
15:00:47 | WATING | Enq: TX - row lock contention | Application | 55765 | 4 | 476 |
15:01:36 | WATING | Enq: TX - allocate ITL entry | Conficuration | -1 | 4 | 476 |
15:01:37 | WATING | Enq: TX - allocate ITL entry | Conficuration | -1 | 4 | 476 |
15:01:38 | WATING | Enq: TX - allocate ITL entry | Conficuration | -1 | 4 | 476 |
15:01:39 | WATING | Enq: TX - allocate ITL entry | Conficuration | -1 | 4 | 476 |
1. AWR 뷰를 이용해 하루 동안의 이벤트 발생현황을 조회해 본다.
그래프는 dba_hist_system_event를 이용해 그린 것인데, 08:15~09:15 구간에서 enq: TM - contention 이벤트가 다량 발생한 것이 확인 되었다.
2. dba_hist_active_sess_history를 조회해서 해당 이벤트를 많이 대기한 세션을 확인 한다.
3. 블로킹 세션 정보를 통해 dba_hist_active_sess_history를 다시 조회한다. 블로킹 세션이 찾아지면 해당 세션이 그 시점에 어떤 작업을 수행 중이었는지 확인한다. sql_id를 이용해 그 당시 SQL과 실행계획까지 확인 할 수 있다. v$sql과 v$sql_plan까지 AWR에 저장되기 때문이다. 위 사례에서는 브로킹 세션이 Append Mode Insert를 수행하면서 Exclusive 모드 TM Lock에 의한 경합이 발생하고 있었다.
4. program, module, action, client_id 등 애플리케이션 정보를 이용해 관련 프로그램을 찾아 Append 힌트를 제거한다. 그러고 나서, 다른 트랜잭션과 동시 DML이 발생할 수 있는 상황에서는 insert문에 Append 힌트를 사용해서는 안 된다는 사실을 개발팀 전체에 공지한다.