如何模拟产生CBC LATCH与buffer busy wait等待事件

数据库版本:Oracle 11.2.0.4.0

CBC latch出现的原因:   --只在逻辑读时产生

1.CBC latch保护不同的链表、不同BH   :同一LATCH下多个BUCKET被同时访问时,(一个LATCH对应多个BUCKET)

2.CBC latch保护同一链表下同一BH  :同一LATCH下同一BH被同时访问时

latch: cache buffers chains 解决方法:

1、_db_block_hash_latches加大latch数量,作用是减少同一LATCH下多个桶被同时访问的情况。即多个表的相应块在BUFFER CACHE中对应不同BH,不同BH又对应在不同HASH BUCKETS,但是这多个HASH BUCKETS是属于同一个LATCH。。

alter system set "_db_block_hash_latches"=10240 scope=spfile;

2、热块:调整BUFFER _CACHE,参数:db_cache_size,big integer 100M

热块是:同一表在BUFFER CACHE中的块(一个块对应一个BH,BH对应一个HASH BUCKET)被多个会话同时读,--全表扫描时容易出现。可以使用多个会话同时读取同一表的同一行的方式来模拟产生CBC latch,查询时使用ROWID做条件,查询速度快,更容易引起CBC latch。

3、修改应用,减少全表扫描

BH上Buffer pin锁状态:

0 未加锁

1 共享锁,读BUFFER BLOCK  ---SELECT

2 独占锁,写BUFFER BLOCK   ---DML语句

Buffer pin锁争用引起:buffer busy waits等待事件 --热块

如何解决:buffer busy waits等待事件 --热块

1.增大PCTFREE

2.使用小数据块-2K-4K

3.使用HASH表分区

3.反向索引

同时出现CBC latch  buffer busy waits的情况是:

会话1已经获得Buffer pin锁,且已经释放CBC latch,正在持有Buffer pin锁

此时会话2获得与会话1同一个的CBC latch,并要获得与会话1 同一个块的Buffer pin锁,此时因会话1正持有Buffer pin锁,产生buffer busy waits等待事件

而会话1需要获得CBC latch,来释放持有的Buffer pin锁,此时会话2正在持有CBC latch,所以也将会产生CBC latch等待事件。

下面通过多会话同时访问产生热块的方式来模拟产生这两种等待:

1.查出表TEST相关信息--在数据量大的表实验更容易产生buffer busy waits

select rowid,

dbms_rowid.rowid_row_number(rowid) rowid_rownum,

dbms_rowid.rowid_relative_fno(rowid) file_id,

dbms_rowid.rowid_block_number(rowid) block_id,test.* from test;

ROWID              ROWID_ROWNUM    FILE_ID   BLOCK_ID OBJECT_NAME  STATUS

------------------ ------------ ---------- ---------- ------------ -------

AAAFSJAAEAAAACkAAA            0          4        164 10           15

AAAFSJAAEAAAACkAAB            1          4        164 10           15

可以看到,TEST表的两条记录在同一文件的同一个BLOCK中。

2.写一个循环:

循环执行查询语句一百万次:--查询164数据块的第一行

declare

aa varchar2(100);

begin

for i in 1..1000000 loop

select object_name into aa from test where rowid='AAAFSJAAEAAAACkAAA';

end loop;

end;

/

循环更新查询语句200次    --查询164数据块的第二行

declare

begin

for i in 1..200 loop

update test set status=15 where rowid='AAAFSJAAEAAAACkAAB';

end loop;

commit;

end;

/

时间: 2024-12-06 09:19:55

如何模拟产生CBC LATCH与buffer busy wait等待事件的相关文章

RAC性能分析gc buffer busy acquire 等待事件

概述---------------------gc buffer busy是RAC数据库中常见的等待事件,11g开始gc buffer  busy分为gc buffer busy acquire和gc buffer  busy release. gc buffer busy acquire是当session#1尝试请求访问远程实例(remote  instance) buffer,但是在session#1之前已经有相同实例上另外一个session#2请求访问了相同的buffer,并且没有完成,那

分析解决11gR2 双节点RAC环境下的gc cr block busy/gc buffer busy acquire等待

?  系统环境 两节点的RAC:AIX6.1+Oracle 11.2.0.3.3   ?  AWR里展示出来的各种症状(数据来自实例2) 虽然应用没有报障,但AWR报告里的各种迹象已经很明显了 (1)     gc buffer busy acquire排进了Top 5 Timed Foreground Events 图-1     (2)     除去DB CPU在gc buffer busy acquire之后的就是gc cr block busy了 图-2     (3)     2h21

oracle等待事件4——buffer busy wait 特别介绍

  以下内容太整理自网络,完全处于学习目的,如有侵权请及时联系我,我会立即删除.   非空闲等待之:buffer busy waits 事件参数说明: 事件号 事件名 参数一 参数二 参数三 145 buffer busy waits file# block# 9i - 原因码 10g - block class# ORACLE会话正在等待PIN住一个缓冲区,会话必须在读取或修改缓冲区之前将该缓冲区PIN住. 在任何时侯只有一个进程可以PIN住一个缓冲区. buffer busy waits表明

[20150122]buffer busy waits特例.txt

[20150122]buffer busy waits特例.txt --oracle 里有句名言:读不阻塞写,写阻塞读. --如果读读模式,是否会出现buffer busy waits呢?通过例子来说明: 1.建立测试环境: SCOTT@test> @ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- --------------------

buffer cache实验7:buffer busy waits-完成

1.buffer busy waits产生原理分析: 一次逻辑读时CBC latch锁及Buffer pin锁的获取和释放过程如下: 1.加Latch X 2.进入hash chain,在相应的BH上加Buffer pin S (0-->1) 3.释放Latch X 4.进行逻辑读--也就是通过BH中的buffer adderss找到数据块在内存中真实位置  ---假如读了1MS 5.加Latch X 6.释放Buffer pin S (1-->0)  0:没锁  1:共享锁 -SELECT

逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析

测试环境:版本11gR2 SQL> select * from v$version where rownum=1; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production 一.逻辑读的过程  1.Oracle以每个块的文件号.

等待模拟-BUFFER BUSY WAIT

create table test_buf(id number,name char(1000)) tablespace test; begin   for idx in 1..100 loop  insert into test_buf values(idx,'aa');  end loop; end; select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid),count(*) from te

oracle等待事件1——高速缓冲内cbc latch

恩..从今天起,木木同学要认真整理一下oracle中常见的等待事件,通过这部分的学习,希望自己能对oracle内部的结构能有一个更清晰的认识,有兴趣的童鞋一起来哇... 1.latch:cache buffers chains 从oracle 9i开始,以只读为目的的查询chains时,可以将cache buffers chains锁存器以shared模式共享,因此有助于减少争用. (我们需要注意,若能共享cache buffer chains 锁存器,理论上理论上不应该发生同时执行select

[20170923]模拟session allocation latch

[20170923]模拟session allocation latch.txt --//oracle 从11g开始(也许10g开始)使用mutex代替latch,但是还是保留大量的使用latch,除了cbc latch外,还有其他latch. --//手工模拟session allocation latch. 1.环境: --//session 1: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BA