数据库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超时限制,避免长事务不提交
