一. 原理
当一个数据块读入到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被同时访问时(全表扫描时容