Troubleshooting performance wait event ‘row cache lock’
Row Cache 或 Data Dictionary Cache 是共享池中的一个内存区域,用于保存数据字典信息以减少数据字典表的物理 I/O。行高速缓存锁主要用于序列化对数据字典的更改,当需要对数据字典高速缓存进行锁定时,将等待该锁,数据字典行上的锁称为row cache lock。等待此事件通常表示发生了某种形式的 DDL,或者可能是递归操作,例如存储管理和递增序列号。
每个行缓存锁将位于特定的数据字典对象上。这称为 enqueue 类型,可以在 v$rowcache 视图中找到。
等待参数(行缓存锁定等待)
参数 | 描述 |
---|---|
第 1 页 | 与 V$ROWCACHE 的 CACHE# 列对应的数字 表示需要行锁的数据字典表 |
第 2 页 | 已持有锁的模式 |
第 3 页 | 需要锁定的模式 |
使用以下查询查找正在等待的缓存(缓存 ID):-
SQL> select p1text,p1,p2text,p2,p3text,p3 from v$session where event='row cache lock'; P1TEXT P1 P2TEXT P2 P3TEXT P3 ----- -- ----- --- ------ ---- cache id 8 mode 0 request 3 SQL> select parameter,count,gets,getmisses,modifications from v$rowcache where cache#=8; PARAMETER COUNT GETS GETMISSES MODIFICATIONS ---------- ------ ---- -------- ------------- DC_SEQUENCES 869 76843 508432 4500
Oracle 不希望获取行高速缓存排队锁,并且 conversions 阻止的时间超过几秒钟。因此,行缓存锁每 3 秒等待一次超时, 如果在 100 次超时 (5 分钟),则假定存在内部死锁,并且操作为 中止,alert log 显示“WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK” 进程状态转储为 写入跟踪文件。
常见原因
DC_SEQUENCES:在使用序列期间,可能会出现此行缓存锁等待。通过检查序列来优化,以查看它们是否指定了 cache 选项,以及该 cache 值是否反映了应用程序预期的同时插入。
DC_OBJECTS:在重新编译对象期间,可能会发生此行缓存锁定等待。如果正在进行对象编译,则可能需要一个排他锁,这将阻止其他活动。通过检查无效对象和依赖项进行优化,检查是否有频繁DDL。
DC_ROLLBACK_SEGS: 高并发导致的UNDO段相关的争用,检查undo使用率或长事务,大事务.
对不起,这篇文章暂时关闭评论。