Oracle SE の DB ロック監視用にカスタマイズされたツールを作成しています。基本的に、gv$session 情報のスナップショットを 10 秒ごとに取得し、それをカスタムメイドの ashstat_data テーブルに保存するスケジューラ ジョブがあります。
そして今、便宜上、セッションブロッキングチェーンを階層形式でリストするビューを作成しようとしています。ビューは、ブロックされたセッションをブロックしているセッションの親の下に子として表示する階層的な選択に基づいています。
with l_snap as
(select *
from ashstat_data
where sample_time>sysdate - interval '10' second )
SELECT
s.sample_time,
' '||LPAD('-', (LEVEL-1), '-' ) || SESSION_ID asid,
s.wait_class,
s.event,
s.LOGON_TIME,
s.sql_id
FROM l_snap s
natural join dba_users d
inner join dba_objects do on s.LOCKED_OBJECT_ID=do.object_id
WHERE s.SESSION_ID IN
(SELECT blocking_session FROM l_snap where blocking_session is not null)
OR s.blocking_session IS NOT NULL
CONNECT BY PRIOR
s.SESSION_ID=s.blocking_session
START WITH s.blocking_session IS NULL
;
これまでのところ、単一のスナップショットからデータを選択している場合にのみ完全に機能します ( where sample_time>sysdate - interval '10' second
):
SAMPLE_TIME ASID WAIT_CLASS LOGON_TIME SQL_ID
5/9/2018 16:13:08.173 302 Idle 05/09/2018 11:33:57
5/9/2018 16:13:08.173 -594 Application 05/09/2018 11:34:01 0wvbggc3p3swx
5/9/2018 16:13:08.173 -646 Application 05/09/2018 11:34:07 0wvbggc3p3swx
しかし、複数のスナップショットからレコードを選択すると (つまり ( where sample_time>sysdate - interval '12' second
)、接続条件に基づいてレコードが配置されます:
SAMPLE_TIME ASID WAIT_CLASS LOGON_TIME SQL_ID
5/9/2018 16:17:18.166 302 Idle 05/09/2018 11:33:57
5/9/2018 16:17:18.166 -594 Application 05/09/2018 11:34:01 0wvbggc3p3swx
5/9/2018 16:17:08.170 -594 Application 05/09/2018 11:34:01 0wvbggc3p3swx
5/9/2018 16:17:18.166 -646 Application 05/09/2018 11:34:07 0wvbggc3p3swx
5/9/2018 16:17:08.170 -646 Application 05/09/2018 11:34:07 0wvbggc3p3swx
5/9/2018 16:17:08.170 302 Idle 05/09/2018 11:33:57
5/9/2018 16:17:18.166 -594 Application 05/09/2018 11:34:01 0wvbggc3p3swx
5/9/2018 16:17:08.170 -594 Application 05/09/2018 11:34:01 0wvbggc3p3swx
5/9/2018 16:17:18.166 -646 Application 05/09/2018 11:34:07 0wvbggc3p3swx
5/9/2018 16:17:08.170 -646 Application 05/09/2018 11:34:07 0wvbggc3p3swx
私が達成したいのは、ブロックチェーンが各スナップショットに対して個別に表されるため、収集されたデータ全体の最後の選択結果が次のようになることです。
SAMPLE_TIME ASID WAIT_CLASS LOGON_TIME SQL_ID
5/9/2018 16:17:18.166 302 Idle 05/09/2018 11:33:57
5/9/2018 16:17:18.166 -594 Application 05/09/2018 11:34:01 0wvbggc3p3swx
5/9/2018 16:17:18.166 -646 Application 05/09/2018 11:34:07 0wvbggc3p3swx
5/9/2018 16:17:08.170 302 Idle 05/09/2018 11:33:57
5/9/2018 16:17:08.170 -594 Application 05/09/2018 11:34:01 0wvbggc3p3swx
5/9/2018 16:17:08.170 -646 Application 05/09/2018 11:34:07 0wvbggc3p3swx