oracle awr报告中无“管控类等待”标准术语,实际指enq: us-contention、row cache lock、library cache lock、enq: tx-row lock contention等资源争用型等待,本质是回滚段分配、数据字典访问、sql共享池及事务锁在高并发下的串行化瓶颈。
“管控类等待”不是标准术语,先确认你看到的是哪类事件
oracle awr 报告里没有叫“管控类等待”的官方分类。如果你在报告中看到大量类似 enq: us - contention、row cache lock、library cache lock、enq: tx - row lock contention 这类事件,它们常被误称为“管控类”——实际是资源争用型等待,本质是 oracle 内部管理机制(如回滚段分配、字典缓存、sql 共享池、事务锁)在高并发下出现的串行化瓶颈。
enq: US - contention 高发:_undo_autotune 在疯狂上线/下线回滚段
Oracle 19c 默认开启隐含参数 _undo_autotune,它会根据事务负载动态调整 online rollback segment 数量。但这个过程要抢 US 队列锁(Undo Segment latch),一旦并发事务多、事务大小不均或短事务密集,就会触发大量 enq: US - contention 等待。
- 查证方式:
SHOW PARAMETER _undo_autotune返回TRUE,且V$UNDOSTAT中maxconcurrency持续 ≥50,COUNT(*)分钟级波动剧烈(比如 20→65→30→72) - 这不是 undo 表空间满了,
UNXPSTEALCNT和OOS才是空间真实指标;enq: US高只说明“分配动作太忙”,不是“没空间” - 临时缓解:
ALTER SYSTEM SET "_undo_autotune"=FALSE SCOPE=BOTH;,再手工设置足够多的 rollback segment(CREATE UNDO TABLESPACE ... RETENTION GUARANTEE)
row cache lock 高:RAC 下无缓存序列或高频数据字典访问
典型场景是应用频繁调用 NEXTVAL 且序列 CACHE 值为 1,每次取值都要更新 SEQ$ 表并加 row cache lock。在 RAC 中,这个锁需跨节点协调,延迟放大,等待陡增。
- 快速验证:
SELECT sequence_name, cache_size, order_flag FROM dba_sequences WHERE cache_size = 1; -
row cache lock在非 RAC 环境极少成为瓶颈,一旦在 RAC 里排进 Top 5,基本锁定是序列或频繁访问的 dictionary object(如OBJ$、IND$) - 别改
_row_cache_cooling_time这类隐含参数——治标不治本;优先调大序列CACHE值(如ALTER SEQUENCE xxx CACHE 20),或改用 IDENTITY 列
library cache lock/pin:硬解析风暴或 DDL 频繁执行
这类等待表明多个会话在争抢同一个 SQL 或 PL/SQL 对象的共享内存结构。常见于:应用未绑定变量导致大量相似 SQL 硬解析;或运维频繁执行 ALTER PACKAGE、GRANT 等 DDL。
- 看
SQL ordered by Parse Calls:如果某 SQL 的 parse calls 远高于 executes,就是绑定变量缺失 - 查
DBA_HIST_SEG_STAT或V$OBJECT_USAGE:确认是否有对象正在被 DDL 锁定(status = INVALID 或 LOCKED) - 注意:
library cache pin往往比library cache lock更危险——它意味着有人正修改对象定义,其他人卡在“等编译完成”,此时杀 session 可能引发 ORA-04021
真正难排查的,是这些等待背后的时间局部性:它们可能只集中在某几分钟内爆发,AWR 小时级汇总会平滑掉峰值。必须结合 V$ACTIVE_SESSION_HISTORY 按分钟切片,才能看清是哪个应用模块、哪条 SQL、在什么业务时段捅了篓子。











