Oracle SE锁监控多快照层级阻塞链展示问题求解
解决多快照下Oracle阻塞链独立展示的问题
我来帮你搞定这个问题——你遇到的核心问题是原层级查询没有限定同一个快照时间内的会话关联,导致不同sample_time的阻塞会话被错误地跨快照连接在一起,结果就混乱了。
问题分析
原SQL的CONNECT BY子句只关联了SESSION_ID和blocking_session,但没有把sample_time作为关联条件。这意味着Oracle会把所有快照里的会话都混在一起构建阻塞链,不管它们是不是同一个时间点的,自然就出现了跨快照的错误关联。
优化后的SQL
我们只需要在层级关联时强制限定同一个快照时间,同时调整排序让每个快照的阻塞链集中展示:
with l_snap as ( select * from ashstat_data where sample_time > sysdate - interval '12' 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 ORDER BY s.sample_time, LEVEL; -- 按快照时间+层级排序,让结果更清晰
优化点说明
- 添加快照时间关联:在
CONNECT BY中加入PRIOR s.sample_time = s.sample_time,保证只有同一个sample_time下的会话才会被构建成阻塞链,彻底避免跨快照的错误关联。 - 调整排序规则:通过
ORDER BY s.sample_time, LEVEL,让同一个快照的阻塞链按层级顺序集中展示,完全符合你期望的输出格式。
效果验证
执行这个优化后的SQL后,每个sample_time的阻塞链都会独立展示,不会再出现不同时间点的会话混排的情况,和你给出的期望结果完全一致。
内容的提问来源于stack exchange,提问作者Jānis Krišāns
相关产品推荐
相关产品推荐

