Oracle数据库row cache lock与latch分析
本文主要探讨了Oracle数据库中的“等待事件row cache lock,latch row cache objects”的处理过程,以及如何通过查询系统视图来分析和理解这类问题。 在Oracle数据库中,"row cache lock"和"latch row cache objects"是与数据缓存相关的等待事件。当数据库操作涉及到行缓存(row cache)的对象时,可能会出现竞争条件,导致会话等待获取或释放这些对象的锁(latch)。这通常意味着多个并发事务试图同时访问或修改同一块数据,从而引发资源争抢。 首先,我们可以通过查询`V$SESSION`视图来识别那些正等待`latch: row cache objects`的会话: ```sql SELECT COUNT(*), event FROM v$session GROUP BY event ORDER BY 1 DESC; ``` 如果结果中`latch: row cache objects`的计数较高,那么就可能存在性能问题。进一步分析,可以查看`V$SESSION`中的`P1`, `P2`, `P3`列,它们分别代表锁的具体信息,如行缓存对象的地址或类型: ```sql SELECT p1, p1RAW, p2, p2RAW FROM v$session WHERE event LIKE '%latch row cache objects%'; ``` 接下来,我们可以使用`V$LATCH_CHILDREN`视图来查看锁的具体上下文。例如,查询`X$KQRST`和`V$LATCH_CHILDREN`以获取与特定锁相关的详细信息,如参数、子节点编号、获取和未命中的次数: ```sql SELECT kqrsttxt PARAMETER, kqrstcln "Lchild#", kqrstgrq "DCGets", l.gets "LGets", l.misses "Misses" FROM x$KQRST, V$LATCH_CHILDREN l WHERE l.addr = &p1 AND l.child# = KQRSTCLN ORDER BY 1, 2; ``` 这里的`&p1`应该替换为之前查询到的`P1`值,以便找出引发等待的具体行缓存对象。 为了分析问题的持续时间和趋势,可以查看`V$ACTIVE_SESSION_HISTORY`和`DBA_HIST_ACTIVE_SESS_HISTORY`历史视图。以下查询可以显示在指定时间段内等待`row cache objects`的所有活动会话: ```sql SELECT v.P1TEXT, v.P1, v.P2TEXT, v.P2 FROM v$active_session_history v WHERE v.EVENT LIKE '%rowcacheobjects%' AND v.SAMPLE_TIME >= TO_DATE('2017-06-02 11:00', 'yyyy-mm-ddhh24:mi') AND v.SAMPLE_TIME <= TO_DATE('2017-06-02 12:00', 'yyyy-mm-ddhh24:mi'); ``` 以及: ```sql SELECT d.P1TEXT, d.P1, d.P2TEXT, d.P2 FROM dba_hist_active_sess_history d WHERE d.EVENT LIKE '%rowcacheobje'; ``` 通过上述查询,可以定位到具体引发等待的事务,并分析其原因。可能的原因包括高并发操作、缓存命中率低、回滚段争用等。优化策略可能包括调整缓存大小、优化SQL语句、增加并发控制或者优化数据库配置,以减少锁争用并提高性能。
row cache objects
处理过程
a:正在进行时
1判断数据库中的等待事件是否是 latch row cache objects
select count(*), event from v$session group by event order by 1 desc; ---latch:row cache objects
2:v$session 中的p1,p2,p3 可以直接定位到 row cache object/lock 中等待的对象
select p1,p1raw,p2,p2raw from v$session where event like '%latch row cache objects%'
3:定位到具体是rowcache中的那个对象产生了竞争等待
SELECT kqrsttxt PARAMETER,
-- kqrstcid CACHE#,
kqrstcln "Lchild#",
kqrstgrq "DCGets",
l.gets "LGets",
l.misses "Misses"
FROM X$KQRST, V$LATCH_CHILDREN l
WHERE l.addr = &p1
and l.child# = KQRSTCLN
ORDER BY 1, 2;
PARAMETER Lchild# DCGets LGets Misses
-------------------------------- ---------- ---------- ---------- ----------
dc_rollback_segments 1 1546954198 4095446607 2258169213
本案例(通过以上方法我们可以直接定位到dc_rollback_segments产生了竞争等待即undo段)
select v.P1TEXT, v.P1, v.P2TEXT, v.P2
from v$active_session_history v
where v.EVENT like '%row cache objects%'
and v.SAMPLE_TIME>=to_date('2017-06-02 11:00','yyyy-mm-dd hh24:mi')
and v.SAMPLE_TIME<=to_date('2017-06-02 12:00','yyyy-mm-dd hh24:mi')
或者
select d.P1TEXT,d.P1,d.P2TEXT,d.P2 from dba_hist_active_sess_history d
where d.EVENT like '%row cache objects%'
and d.SAMPLE_TIME>=to_date('2017-06-02 11:00','yyyy-mm-dd hh24:mi')
and d.SAMPLE_TIME<=to_date('2017-06-02 12:00','yyyy-mm-dd hh24:mi')
-------------------------------------------------------------
address 107322559952 number 411
address 107322559952 number 411
address 107322559952 number 411
address 107322559952 number 411
address 107322559952 number 411
address 107322559952 number 411
address 107322559952 number 411
address 107322559952 number 411
address 107322559952 number 411
address 107322559952 number 411
.......
因为是过去时刻,此时的p1已经被转换成10进制,需要我们重新转换成16进制
select upper(to_char(107322559952,'xxxxxxxxxxxxxxxx')) from dual;
------------------------------------------------------------------
剩余6页未读,继续阅读
- 粉丝: 191
- 资源: 107
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++多态实现机制详解:虚函数与早期绑定
- Java多线程与异常处理详解
- 校园导游系统:无向图实现最短路径探索
- SQL2005彻底删除指南:避免重装失败
- GTD时间管理法:提升效率与组织生活的关键
- Python进制转换全攻略:从10进制到16进制
- 商丘物流业区位优势探究:发展战略与机遇
- C语言实训:简单计算器程序设计
- Oracle SQL命令大全:用户管理、权限操作与查询
- Struts2配置详解与示例
- C#编程规范与最佳实践
- C语言面试常见问题解析
- 超声波测距技术详解:电路与程序设计
- 反激开关电源设计:UC3844与TL431优化稳压
- Cisco路由器配置全攻略
- SQLServer 2005 CTE递归教程:创建员工层级结构