首页 » ORACLE 9i-23ai » Troubleshooting performance wait event ‘row cache lock’

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使用率或长事务,大事务.

打赏

对不起,这篇文章暂时关闭评论。