You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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; -- 按快照时间+层级排序,让结果更清晰

优化点说明

  1. 添加快照时间关联:在CONNECT BY中加入PRIOR s.sample_time = s.sample_time,保证只有同一个sample_time下的会话才会被构建成阻塞链,彻底避免跨快照的错误关联。
  2. 调整排序规则:通过ORDER BY s.sample_time, LEVEL,让同一个快照的阻塞链按层级顺序集中展示,完全符合你期望的输出格式。

效果验证

执行这个优化后的SQL后,每个sample_time的阻塞链都会独立展示,不会再出现不同时间点的会话混排的情况,和你给出的期望结果完全一致。

内容的提问来源于stack exchange,提问作者Jānis Krišāns

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:43:26