Cache Buffer Chain(CBC) Latch解析
2018-03-24 00:20
411 查看
[+]
2.获取CBC latch
3.根据hash值,搜索CBC链表
4.根据DBA找到BH(Buffer header)加buffer pin
5.加完buffer pin马上释放CBC latch
6.访问buffer开始fetch数据
7.获取CBC latch
8.释放buffer pin
9.释放CBC latch
体现在实际情况通常为低效率的sql语句(逻辑读过高)。在某些环境中,应用程序打开执行相同的低效率sql的多个并发会话,这些病发会话都设法得到相同的数据集,每次执行都带有高buffer_gets。相反,较少的逻辑读则意味着较少的latch get操作,从而减少锁存器争用并改善性能。注意v$sql中buffer_gets/executions大的语句。
2.CBC latch保护同一链表下同一BH,即同一latch下同一BH被同时访问时(全表扫描时容易出现)
Hot Block:当多个会话重复访问一个或多个由同一个子cache buffer chains锁存器保护的块时,热块就会产生。即多个会话争用cache buffer chains子锁存器。
3.同时出现CBC latch和buffer busy waits的情况:已经有会话获取了buffer pin锁,此时会话1时获取了CBC latch,但是无法获得buffer pin锁,此时会话1出现buffer busy waits。如果有其他会话想要访问此CBC latch下的其他hash chain或者访问和会话1 相同的BH,就会出现CBC latch等待。
[sql] view plain copySQL> select rowid,
2 dbms_rowid.rowid_row_number(rowid) rowid_rownum,
3 dbms_rowid.rowid_relative_fno(rowid) file_id,
4 dbms_rowid.rowid_block_number(rowid) block_id,test_buffer_busy.object_id from test_buffer_busy where rownum<3;
ROWID ROWID_ROWNUM FILE_ID BLOCK_ID OBJECT_ID
------------------ ------------ ---------- ---------- ----------
AAAVXOAAEAAAAw7AAA 0 4 3131 20
AAAVXOAAEAAAAw7AAB 1 4 3131 46
session1:
[sql] view plain copySQL> declare
2 aa varchar2(100);
3 begin
4 for i in 1..1000000 loop
5 select object_name into aa from test_buffer_busy where rowid='AAAVXOAAEAAAAw7AAA';
6 end loop;
7 end;
8 /
session2:
[sql] view plain copySQL> declare
2 begin
3 for i in 1..1000000 loop
4 update test_buffer_busy set status=15 where rowid='AAAVXOAAEAAAAw7AAB';
5 end loop;
6 commit;
7 end;
8 /
sesison3:
[sql] view plain copySQL> select sid ,event,total_waits from v$session_event where sid in(1,17) and event like '%buffer%'
2 ;
SID EVENT TOTAL_WAITS
---------- ---------------------------------------------------------------- -----------
1 latch: cache buffers chains 21
1 buffer busy waits 48
17 latch: cache buffers chains 9
17 log buffer space
一. 原理
当一个数据块读入到sga中时,该块的块头(buffer header)地址存放在一个hash bucket的链表(hash chain)中。该内存结构由一系列cache buffer chains子latch保护(cbc latch)。对buffer cache中的块,要select或者update、insert、delete等,都得先获得cache buffer chains子latch,以保证对chain的排他访问。若在过程中发生争用,就会等待latch:cache buffer chains事件。逻辑读的过程:
1.Oracle以每个块的文件号,块号和类型做hash运算,得到hash值。根据hash值,到hash表中取出指定块的内存地址。2.获取CBC latch
3.根据hash值,搜索CBC链表
4.根据DBA找到BH(Buffer header)加buffer pin
5.加完buffer pin马上释放CBC latch
6.访问buffer开始fetch数据
7.获取CBC latch
8.释放buffer pin
9.释放CBC latch
二.产生原因
1.CBC latch保护不同的链表、不同BH,即同一latch下多个BUCKET被同时访问时(一个latch对应多个BUCKET)。体现在实际情况通常为低效率的sql语句(逻辑读过高)。在某些环境中,应用程序打开执行相同的低效率sql的多个并发会话,这些病发会话都设法得到相同的数据集,每次执行都带有高buffer_gets。相反,较少的逻辑读则意味着较少的latch get操作,从而减少锁存器争用并改善性能。注意v$sql中buffer_gets/executions大的语句。
2.CBC latch保护同一链表下同一BH,即同一latch下同一BH被同时访问时(全表扫描时容易出现)
Hot Block:当多个会话重复访问一个或多个由同一个子cache buffer chains锁存器保护的块时,热块就会产生。即多个会话争用cache buffer chains子锁存器。
3.同时出现CBC latch和buffer busy waits的情况:已经有会话获取了buffer pin锁,此时会话1时获取了CBC latch,但是无法获得buffer pin锁,此时会话1出现buffer busy waits。如果有其他会话想要访问此CBC latch下的其他hash chain或者访问和会话1 相同的BH,就会出现CBC latch等待。
三.模拟产生CBC latch等待
测试表:[sql] view plain copySQL> select rowid,
2 dbms_rowid.rowid_row_number(rowid) rowid_rownum,
3 dbms_rowid.rowid_relative_fno(rowid) file_id,
4 dbms_rowid.rowid_block_number(rowid) block_id,test_buffer_busy.object_id from test_buffer_busy where rownum<3;
ROWID ROWID_ROWNUM FILE_ID BLOCK_ID OBJECT_ID
------------------ ------------ ---------- ---------- ----------
AAAVXOAAEAAAAw7AAA 0 4 3131 20
AAAVXOAAEAAAAw7AAB 1 4 3131 46
session1:
[sql] view plain copySQL> declare
2 aa varchar2(100);
3 begin
4 for i in 1..1000000 loop
5 select object_name into aa from test_buffer_busy where rowid='AAAVXOAAEAAAAw7AAA';
6 end loop;
7 end;
8 /
session2:
[sql] view plain copySQL> declare
2 begin
3 for i in 1..1000000 loop
4 update test_buffer_busy set status=15 where rowid='AAAVXOAAEAAAAw7AAB';
5 end loop;
6 commit;
7 end;
8 /
sesison3:
[sql] view plain copySQL> select sid ,event,total_waits from v$session_event where sid in(1,17) and event like '%buffer%'
2 ;
SID EVENT TOTAL_WAITS
---------- ---------------------------------------------------------------- -----------
1 latch: cache buffers chains 21
1 buffer busy waits 48
17 latch: cache buffers chains 9
17 log buffer space
相关文章推荐
- 逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析
- 逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析
- 逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析
- 逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析
- 逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析
- Cache Buffer Chain(CBC) Latch解析
- cache buffer chain latch
- 来,锁个痛快(2)―― latch:buffer cache chain和buffer cache lru chain
- Latch工作原理,buffer busy waits,cache buffer chain
- Buffer Latch Timeout的解析
- +++++buffer cache 深度解析
- Latch: cache buffer chains等待事件的学习
- Tuning the Redolog Buffer Cache and Resolving Redo Latch Contention
- Know more about Buffer Cache and Latch
- Buffer busy wait与latch :cache buffers chains有何联系?
- Buffer Latch Timeout的解析
- buffer cache chain 图
- Fix high "cache buffer chain" waits
- Cache buffers chains latch 与Cache buffers LRU chain latch
- Oracle buffer cache与相关的latch等待事件