我正在为Oracle SE创建用于DB锁监视的自定义工具。基本上,我有调度器作业,它每10秒获取gv$session信息的快照,并将其存储在定制的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发布于 2018-05-09 15:00:19
您可能需要将sample_time添加到CONNECT BY子句中:
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
and prior s.sample_time = s.sample_time
START WITH s.blocking_session IS NULL
;https://stackoverflow.com/questions/50255797
复制相似问题