SQLを実行した時、実行プランは同じなのに実行タイミングによって実行時間が大きく変わるような場合があります。こんな時は想定外の待機イベントが発生している可能性が高いです。 AWRレポートを確認すれば良いのでしょうが、DBA_HIST_ACTIVE_SESS_HISTORY や、V$ACTIVE_SESSION_HISTORYを参照する事である程度確認がとれます。(注:diagnostics pack ライセンス契約がされている必要あります)
diagnostic packライセンス契約がない場合は以下動的パフォーマンスビューを定期的に参照する事で確認する事もできます。
- V$SESSION_WAIT
- V$SYSTEM_EVENT
- V$SESSION_EVENT
V$ACTIVE_SESSION_HISTORY
直近 流れたSQLの待機イベントを確認できます。 SGA上のASHバッファに保持(1秒間隔)しているデータを出力してくれます。V$ACTIVE_SESSION_HISTORYは、SQL_IDとSQL_CHILD_NUMBERも保持しているので、DBMS_XPLAN.DISPLAY_CURSOR() を使うとその時の実行プランも確認できます。以下SQLはバックグランド実行SQLと、デフォルトのスキーマ(COMMON = ‘NO’)での実行SQLは対象外としていますが、必要に応じて条件を変えてお使いください。
select t.SAMPLE_TIME,t.SESSION_ID,t.SESSION_SERIAL#,u.USERNAME ,t.SQL_ID ,t.SQL_CHILD_NUMBER,t.SQL_OPNAME,t.SQL_PLAN_OPERATION,t.SQL_EXEC_START ,t.EVENT,t.WAIT_CLASS,t.WAIT_TIME,t.SESSION_state,t.TIME_WAITED,t.PROGRAM,t.MODULE,t.ACTION from V$ACTIVE_SESSION_HISTORY t left outer join dba_users u on t.USER_ID = u.USER_ID where t.SESSION_TYPE ='FOREGROUND' and u.COMMON = 'NO' order by t.SAMPLE_TIME desc ;
DBA_HIST_ACTIVE_SESS_HISTORY
かつて流れたSQLの待機イベントを確認できます。SYSAUXのテーブル内に保持(10秒間隔)デフォルトは8日間保持。ただし、SQLの実行からこのビューへ反映されるまでにタイムラグあり。以下SQLはバックグランド実行SQLと、デフォルトのスキーマ(COMMON = ‘NO’)での実行SQLは対象外としていますが、必要に応じて条件を変えてお使いください。
select sample_time,session_type,u.username ,h.sql_id ,event ,program ,module ,pga_allocated -- サンプルの取得時にこのセッションが消費したPGAメモリーの量(バイト) ,temp_space_allocated -- サンプルの取得時にこのセッションが消費したTEMPメモリーの量(バイト) , sql_opname,t.SQL_TEXT from dba_hist_active_sess_history h left outer join dba_users u on h.USER_ID = u.USER_ID left outer join v$sqltext t on h.SQL_ID = t.SQL_ID and t.PIECE = 0 where h.SESSION_TYPE='FOREGROUND' and u.COMMON = 'NO' order by sample_time desc ;