この投稿では、Oracleセッションの待機イベント履歴を取得するためのさまざまなクエリについて説明します。
開始からの特定のセッションでの待機イベントの履歴は、以下のクエリを使用して見つけることができます
行120トリムスプールを
colイベントヘッド「Waitedfor」フォーマットa30
coltotal_waitshead「Total|Waits」フォーマット999,999
coltw_mshead「Waited|for(ms)」フォーマット999,999.99
col aw_ms head“ Average | Wait(ms)” format 999,999.99
col mw_ms head“ Max | Wait(ms)” format 999,999.99
select event、total_waits、time_waited 10 tw_ms、
average_wait 10 aw_ms、max_wait * 10 mw_ms
from v $ session_event
ここで、sid =&1
/
特定の期間のセッションの待機イベント履歴を表示して、その期間の待機イベントのみを取得するとします
次に、以下のASHクエリを使用してデータを抽出できます
SQL> SELECT event、count()
FROM dba_hist_active_sess_history a
WHERE a.sample_time BETWEEN to_date('12 -OCT-2016 11:49:00'、' DD-MON-YYYY HH24: MI:SS')AND
to_date('12 -OCT-2016 15:04:00'、'DD-MON-YYYY HH24:MI:SS')and session_id =1853 and SESSION_SERIAL#=19 group by event;
イベント数( )
ログファイル同期88
SQL> SELECT module、count()
2 FROM dba_hist_active_sess_history a
3 WHERE a.sample_time BETWEEN to_date('12 -OCT-2016 11:49:00'、' DD-MON-YYYY HH24:MI:SS')AND
4 to_date('12 -OCT-2016 15:04:00'、'DD-MON-YYYY HH24:MI:SS')and session_id =1853 and SESSION_SERIAL#=19 and event ='log file sync' group by module;
MODULE COUNT( )
e:FND:cp:FNDICM 88
過去1時間の待機イベントの履歴を知りたい場合は、以下のクエリを使用できます
column sample_time format a30
select sample_time、session_state、event、sql_id
from v $ active_session_history
where session_id =&1 and sample_time> SYSDATE – 30 /(24 * 60)
order by 1;
テクニックの重要なユースケース。
特定の期間中に待機していた特定のセッションと、それをブロックしていたものを知りたいとします。
以下のクエリを使用して、待機イベントやその他の重要なものを取得できます
col event format a30
col sample_time format a25
select session_id、sample_time、session_state、event、wait_time、time_waited、sql_id、sql_child_number CH#
from v $ active_session_history
where session_id =19
とsample_timeの間
to_date( '9-DEC-16 01.25.00 PM'、'dd-MON-yy hh:mi:ss PM')
と
to_date( '9-DEC-16 02.25.00 PM'、'dd-MON-yy hh:mi:ss PM')
sample_timeで並べ替え;
イベントがenq:TX –行ロックの競合である場合、特定のセッションがそれをブロックすることがわかっています。
sample_time、session_state、blocking_session、current_obj#、current_file#、current_block#、current_row#
from v $ active_session_history
where sample_time between
to_date( '9-DEC-16 01.25.00 PM' 、'dd-MON-yy hh:mi:ss PM')
and
to_date( '9-DEC-16 02.25.00 PM'、'dd-MON-yy hh:mi:ss PM ')
and session_id =19
and event ='enq:TX – row lock contention'
order by sample_time;
Blocking_sessionは、セッションがブロックされたセッションIDを表示します。ブロックされたセッションに対して上記で取得したsql_idを使用して、sqlステートメントを抽出することもできます。
同様のクエリを使用して、ブロックしているセッションの情報を特定し、適切な修正アクションを実行できます
重要な情報
これらのクエリには、頻繁にアクティブなセッション履歴とアクティブなセッション履歴アーカイブを使用していることをご存知でしょう。
アクティブセッション履歴とは
アクティブセッション履歴はデータベースをポーリングしてアクティブセッションを識別し、ユーザーID、状態、接続元のマシン、実行中のSQLなど、各セッションに関連する情報をシステムグローバルの特別な領域にダンプします。 ASHバッファと呼ばれるデータベースインスタンスの領域(SGA)
アクティブセッション履歴アーカイブ
アクティブセッション履歴は、データベースインスタンスからアクティブセッションに関する情報を毎秒収集します。データベースのアクティビティによっては、ASHバッファ内に大量のデータが収集されることになりますが、ASHバッファはメモリに常駐する構造であるため、限られた量のスペースしかありません。さらに、インスタンスがダウンすると、インスタンスのメモリも一緒に消えます。したがって、Oracle Databaseは、ASHバッファからデータベース表に情報をアーカイブして、永続化します。このアーカイブされたテーブルデータは、DBA_HIST_ACTIVE_SESS_HISTORY
というビューに表示されます。
関連記事
Oracle ASH(アクティブセッション履歴)有用なクエリ
どのsidが全表スキャンを実行しているかを見つける方法
Oracleデータベースでセッションの詳細を見つける方法
DB時間と平均アクティブセッション、Oracleのアクティブセッションとは
たくさんのやり直しを生成するセッションを見つける方法