cache buffers chains是相对比较常见的冲突事件,绝大部分的cache buffers chains是SQL语句访问过多的内存引起,由抵效的SQL引起。个别情况下由于热点访问引起。
简单判断SQL是否访问了过多的内存访问,可以通过简单的看访问返回了多少条记录,经过了多少次buffer gets。一般来说,对于单表查询,获得一条记录不应该超过20个Block gets,而对于Join查询,则不应该超过100个buffer gets。
对于热点块,则可以以以下简单的方式判断:
如果热点正在发生,则只要简单的把wait event的p1raw取出来就可以,看看大家是否在访问相同的latch address。如果总是相同,则是热点,如果不同,则不是热点。
select p1raw from v$session_wait where event_name=’latch: cache buffers chains’;
如果是事后判断,则可以通过v$latch_children来间接的判断。
select * from (
select addr, child#,gets,sleeps from v$latch_children
where name=’cache buffers chains’ order sleeps desc
) where rownum<50
如果出现的结果很不均匀,则表示为热点冲突。
可以通过hladdr访问x$BH来获得热点块
select dbarfile,dbablk,tch from x$bh where hladdr=<hladdr>
找到热点块之后,只有通过热点数据分布到不同数据块,来降低热点访问。
分布方式
(1)、pctfree
(2)、partition
(3)、重新插入数据