Oracle等待事件(一)—— latch cache buffers chains 分析与优化思路
一、 什么是CBC等待
首先我们需要知道CBC等待发生在哪里,为什么会发生,才能理解应该如何定位,如何处理。
首先,CBC latch是用于保护buffer cache的,因此CBC等待一定发生在buffer cache部分。
1. 如何定位数据块是否在buffer cache中
首先,通过对数据块所在的文件号和块号进行hash计算,算出对应bucket号(hash bucket)。
沿着对应hash bucket所在hash chain list访问链上的buffer header(bh,相关信息由x$bh视图描述),hash chain list上挂载了一或多个bh,bh与Data block一一对应。
整体定位流程大致如下
2. CBC等待是如何发生的
从上图中可以看到,一个latch负责保护多个hash bucket,如果有多个会话需要同时访问一个hash chain list,就会在latch处发生争用,只有一个会话可以持有latch,其余会话需要等待 latch cache buffers chains。
根据会话集中访问对象的不同,cbc等待主要有两种成因:
- 同一个cache buffers chains下不同block被频繁访问,称为hot chains
- 同一个cache buffers chains下同一个block被频繁访问,称为hot block
一个块的访问过程,一般会有2次cbc latch的获取、释放。
二、 如何分析CBC等待
分为两种情况:等待正在发生(能从v$session查到),分析历史的CBC等待(需要从v$ash或者dba_ash中获取信息)。
1. CBC等待正在发生
当大量会话出现cbc等待,或者慢sql长时间处于cbc等待时可用。特征是v$session的event字段为 latch: cache buffers chains,可以根据 v$session P1RAW字段(内存地址原始值,16进制)找到内存地址对应对象。
select FILE#,DBARFIL,DBABLK,TCH from X$bh where HLADDR='v$session P1RAW字段' order by TCH desc;
-- 多跑几次找到排在前列的几个
FILE# DBARFIL DBABLK TCH
---------- ---------- ---------- ----------48 48 2454391 24048 48 488777 226401 401 29196 224
DBARFIL为文件号,DBABLK为块号,从dba_extents 查询对应对象名,看在慢sql执行计划中能否找到(是否为sql monitor activity占比最大的对象),如果有则可以对应处理(参考解决方法部分)。
select /*+ parallel(t,16)*/ * from dba_extents t where file_id=48 and 2454391 between block_id and block_id+blocks-1;
也可以使用以下语句直接查询
select name, file#, dbablk, obj, tch, hladdr
from x$bh bh, obj$ owhere o.obj#(+)=bh.obj andhladdr in
(select ltrim(to_char(p1,'XXXXXXXXXX') )from v$active_session_history where event like 'latch: cache buffers chains'group by p1 having count(*) > 5
)and tch > 5
order by tch example outputNAME FILE# DBABLK OBJ TCH HLADDR
------------- ----- ------ ------ --- --------
BBW_INDEX 1 110997 66051 17 6BD91180
IDL_UB1$ 1 54837 73 18 6BDB8A80
VIEW$ 1 6885 63 20 6BD91180
VIEW$ 1 6886 63 24 6BDB8A80
DUAL 1 2082 258 32 6BDB8A80
DUAL 1 2081 258 32 6BD91180
MGMT_EMD_PING 3 26479 50312 272 6BDB8A80
2. 分析历史的CBC等待
- 查询哪些sql遇到过大量cbc等待
select count(*), sql_id, nvl(o.object_name,ash.current_obj#) objn,substr(o.object_type,0,10) otype,CURRENT_FILE# fn,CURRENT_BLOCK# blockn
from v$active_session_history ash, all_objects o
where event like 'latch: cache buffers chains'and o.object_id (+)= ash.CURRENT_OBJ#
group by sql_id, current_obj#, current_file#,current_block#, o.object_name,o.object_type
order by count(*);CNT SQL_ID OBJN OTYPE FN BLOCKN
---- ------------- -------- ------ --- ------84 a09r4dwjpv01q MYDUAL TABLE 1 93170
找到sql_id后,可以具体分析其v$ash视图P1,P2,P3字段,定位热块和对象信息。
- 查询v$ash视图P1,P2,P3字段含义
select * from v$event_name where name = 'latch: cache buffers chains';EVENT# NAME PARAMETER1 PARAMETER2 PARAMETER3
---------- ---------------------------- ---------- ---------- ----------58 latch: cache buffers chains address number tries
- 将p1表示的地址值转换为16进制
selectcount(*),lpad(replace(to_char(p1,'XXXXXXXXX'),' ','0'),16,0) laddr
from v$active_session_history
where event='latch: cache buffers chains'
group by p1
order by count(*);COUNT(*) LADDR
---------- ----------------4933 00000004D8108330
- 关联x$bh与obj$基表,找到热块及对应对象名,分析慢sql执行计划看是否符合慢的原因
select o.name, bh.dbarfil, bh.dbablk, bh.tch
from x$bh bh, obj$ o
where tch > 5and hladdr='00000004D8108330'and o.obj#=bh.obj
order by tchNAME DBARFIL DBABLK TCH
----------- ------- ------ ----
EMP_CLUSTER 4 394 120
三、 解决方法
总的思路其实就是打散热块。
1. 加大表或索引pctfree(大表谨慎操作)
alter table 表名 pctfree 90;
alter table 表名 move;
alter index 索引名 rebuild;
2. 表做hash分区
3. 使用hash簇表,打散数据存放位置
4. 过热表改用全表扫描
将nest loop join改为merge join或hash join,如果对应表不大,可以尝试将消耗最高的部分修改为全表扫描观察效果
5. 使用反键或hash索引(针对索引)
6. 减少表空间block size,使每个数据块中存放更少的行(慎用)
alter table <table_name> minimize records_pre_block;
四、 其他
查询遇到过最大cbc等待的块
col object_name for a35
col cnt for 99999SELECTcnt, object_name, object_type,file#, dbablk, obj, tch, hladdr
FROM (select count(*) cnt, rfile, block from (SELECT /*+ ORDERED USE_NL(l.x$ksuprlat) */ --l.laddr, u.laddr, u.laddrx, u.laddrr,dbms_utility.data_block_address_file(to_number(object,'XXXXXXXX')) rfile,dbms_utility.data_block_address_block(to_number(object,'XXXXXXXX')) blockFROM (SELECT /*+ NO_MERGE */ 1 FROM DUAL CONNECT BY LEVEL <= 100000) s,(SELECT ksuprlnm LNAME, ksuprsid sid, ksuprlat laddr,TO_CHAR(ksulawhy,'XXXXXXXXXXXXXXXX') objectFROM x$ksuprlat) l,(select indx, kslednam from x$ksled ) e,(SELECTindx, ksusesqh sqlhash, ksuseopc, ksusep1r laddrFROM x$ksuse) uWHERE LOWER(l.Lname) LIKE LOWER('%cache buffers chains%') AND u.laddr=l.laddrAND u.ksuseopc=e.indxAND e.kslednam like '%cache buffers chains%')group by rfile, block) objs, x$bh bh,dba_objects o
WHERE bh.file#=objs.rfileand bh.dbablk=objs.block and o.object_id=bh.obj
order by cnt;CNT OBJECT_NAME TYPE FILE# DBABLK OBJ TCH HLADDR
---- ----------------- ----- ----- ------- ------ ----- --------1 WB_RETROPAY_EARNS TABLE 4 18427 52701 1129 335F7C001 WB_RETROPAY_EARNS TABLE 4 18194 52701 1130 335F7C003 PS_RETROPAY_RQST TABLE 4 13253 52689 1143 33656D003 PS_RETROPAY_RQST INDEX 4 13486 52692 997 33656D003 WB_JOB TABLE 4 14443 52698 338 335B90805 PS_RETROPAY_RQST TABLE 4 13020 52689 997 33656D005 WB_JOB TABLE 4 14676 52698 338 335B9080
查询数据块在buffer cache中有多少副本
select count(*), name, file#, dbablk, hladdr
from x$bh bh, obj$ o
where o.obj#(+)=bh.obj andhladdr in
(select ltrim(to_char(p1,'XXXXXXXXXX') )from v$active_session_history where event like 'latch: cache%'group by p1
)
group by name,file#, dbablk, hladdr
having count(*) > 1
order by count(*);CNT NAME FILE# DBABLK HLADDR
--- ---------- ------ ------- --------14 MYDUAL 1 93170 2C9F4B20
参考
https://sites.google.com/site/embtdbo/wait-event-documentation/oracle-latch-cache-buffers-chains
https://yq.aliyun.com/articles/208510
https://www.slideshare.net/khailey/oracle-10g-performance-chapter-06-buffer-cache
Oracle等待事件(一)—— latch cache buffers chains 分析与优化思路相关推荐
- oracle数据库latch,关于Oracle数据库latch: cache buffers chains等待事件
关于Oracle数据库latch: cache buffers chains等待事件 latch: cache buffers chains等待事件的原理 当一个数据块读入到sga中时,该块的块头(b ...
- oracle中的latch: cache buffers chains 与热块
oracle中的latch: cache buffers chains 与热块 oracle中的latch: cache buffers chains 与热块 ORACLE中的buffer cache ...
- oracle等待资源时间加长,案例:Oracle等待事件latch: cache buffers chains故障优化处理总结...
天萃荷净 数据库的CPU使用率为100%,应用相应迟缓.查看AWR中数据库的latch:cache buffers chains等待较多 当一个数据块读入sga区,相应的buffer header会被 ...
- 等待事件 latch:cache buffers chains
原理: 当一个数据块读入到sga中时,该块的块头(buffer header)会放置在一个hash bucket的链表(hashchain)中. 该内存结构由一系列cache buffers chai ...
- latch:cache buffers chains等待事件导致的latch争用的原理原因与检查
latch:cache buffers chains 原理 当一个数据块读入到sga中时,该块的块头(buffer header)会放置在一个hash bucket的链表(hash chain)中.该 ...
- 深入理解latch: cache buffers chains
事件背景: 一个客户的数据库发生了宕机事件,查看了数据库的awr报告,原来是由于出现大量的latch: cache buffers chains等待事件导致系统消耗量大量的CPU,最终导致系统h ...
- 深入理解 latch: cache buffers chains
事件背景: 一个客户的数据库发生了宕机事件,查看了数据库的awr报告,原来是由于出现大量的latch: cache buffers chains等待事件导致系统消耗量大量的CPU,最终导致系统h ...
- latch: cache buffers chains 阻塞 buffer busy waits
os: centos 7.4 db: oracle 11.2.0.4 版本 # cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) ...
- latch: cache buffers chains故障处理总结
客户说数据库的CPU使用率为100%,应用相应迟缓. 发现是latch: cache buffers chains 作祟 故障分析思路 查看等待事件,判断故障起因 1 SQL>select * ...
最新文章
- 懂语言者得天下:NLP凭什么被称为人工智能的掌上明珠?
- pip install python-docx报错_python各种模块的安装
- 百兆以太网传输距离_新品推荐 16+2G口百兆/千兆监控接入型非标PoE交换机!
- OpenStack入门篇(八)之镜像服务Glance
- Java打印车票主要学习Java的比较语句
- 目标检测比赛中的 trick
- c语言四字节转浮点数_C语言浮点书于字节互相转换
- 漫步数学分析十三——路径连通
- c语言fopen函数读dat文件,C语言 从a.dat文件读入数据存入b.dat文件里面(以字符形式)...
- .desktop 桌面快捷_两个按键:手机截屏且保存至电脑桌面
- 易宝支付(Java实现)
- 如何使用QGIS下载Google地图的遥感影像
- 惠普T620瘦客户机安装Win7时AMD显卡驱动造成Aero透明效果不能使用
- APP 兼容性测试是什么?8年测试老鸟告诉你
- 安装Java Visualvm监控堆内存和参数说明
- sed 技巧一例:特定位置插入
- 单片机——神奇的中断嵌套实验
- JavaScript Date getTime() 方法
- LeetCode-590. N-ary Tree Postorder Traversal
- 数据恢复领军企业飞客与全球数据恢复“兵工厂”ACE建立战略合作