-
数据库TOP等待“enq: TX - row lock contention”:
-
Load Profile无明显异常,OS负载均正常:
-

3.尝试查看hist 时间段的sql信息,执行结果几分钟都不出结果,SQL查询执行计划:

4.分析dba_hist_active_sess_history(基表
SYS.
WRH$_ACTIVE_SESSION_HISTORY),基于sample无索引;由于设置保留策略,基表仅20W数据,导致阻塞查询COST相当高:

5.创建基于时间段的临时表,降低COST基数:
create test.tmp_ash as select *
from dba_hist_active_sess_history t where to_date(to_char(SAMPLE_TIME,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') >=to_date('2025/12/08 15:00:00','yyyy-mm-dd hh24:mi:ss') and to_date(to_char(SAMPLE_TIME,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') <=to_date('2025/12/08 15:05:00','yyyy-mm-dd hh24:mi:ss')
--创建基于sample_time索引(略)
6.基于临时表查询执行计划及结果:
--COST大幅度降低

--查询结果主要等待事件"enq: TX - row lock contention"

7. 查询 hist 阻塞 , 至少 3 sid 进行 update 相同行

8.取样单个update为索引唯一扫描

9.汇总故障时间段的阻塞:

sid 492阻塞sid134次数28449
sid 492阻塞sid367次数74820
10.性能原因及建议:
原因:唯一索引行锁阻塞,在同时间多个会话获取同一行(unique scan)。
优化建议:
-优化锁控制机制,规避多个事务同时获取相同行锁(多线程行互斥锁定)
-设置tx超时限制,避免长事务不提交