您的位置:首页 > 数据库 > Oracle

8.Oracle深度学习笔记——BUFFER CACHE深入一

2016-01-27 23:46 423 查看
8.Oracle深度学习笔记——BUFFER CACHE深入一
欢迎转载,转载请标明出处:  http://blog.csdn.net/notbaron/article/details/50597346      

 最近项目一直和ORACLE死磕,感觉总是找不到出口,只能多看书少说话了。

         先记录多少是多少吧!

BUFFER CACHE在ORACLE的所有内存池中占了最大空间。

1.  HASH链表

Oracle通过HASH算法确定文件中的块是否在BUFFERCACHE中。

HASH算法在搜索算法中最快的,在内存中搜索数据的算法都是采用HASH算法。

HASH中有一个概念叫做Bucket,数量由参数_db_block_hash_buckets参数设置。

         每当要读取一个数据块的时候,根据块艘在的文件、块号计算一个HASH值。通过HASH值得到BUCKET,就可以得到BUCKET中的内容。

         BUCKET中保存一个指向CacheBuffers Chain的链表头的指针。

         每个Buffer都有一个BufferHeader叫做Buffer Header (简称BH).

         HASH值一样的BUFFERHeader组成链表,链表叫做CBC链表(Cache Buffer Chains)

         BUFFERCAHCHE 哈希表的BUCKET中,存放的CBC链表头。

Oracle查找BUFFER的过程大概是这个样子的:

         数据库要找某个号的块,那么先根据文件号、块号计算块的HASH值,然后通过HASH值找到对应的BUCKET,BUCKET指向CBC链头,然后在链表搜索每个BH(文件号,块号),取出其中的BA,根据BA找个需要的BUFFER。

         PS:BH中包含BA( BufferAddress)是块在BUFFER CACHE中的地址,根据这个地址可以直接访问BUFFER。

         当然,到这里故事并没有结束,如果遍历完链表没有找到BUFFER,说明块没有在BUFFER中,只能物理读了。

2.  Latch:Cache Buffers Chain

Oracle机制关于访问共享内存,需要Latch和Mutex.

搜索列表,访问BH中的BA,都需要LATCH保护。 CacheBuffers Chian Latch检查CBC Latch.

想访问链表,必须先申请CBC LATCH,在链表中寻找目标BH,需要对BH修改,修改是为了加锁(Buffer Pin锁),加锁完毕后CBC Latch释放。Buffer Pin锁保护访问的Buffer.

CBC Latch期间主要是:搜索链表,查找BH,然后修改BH中的Buffer Pin锁。

主要注意的是一个CBCLatch其实是保护好几个Bucket的,意味着一个多个链表使用了同一Latch,所以这些链表不能再同一时间进行搜索了。Oracle这样的目的是为了节约内存。

查看CBC Latch使用的内存量如下:

sys@PDB1> select to_number(b.addr,'xxxxxxxxxxxxxxxxxxxxx')-to_number(a.addr,'xxxxxxxxxxxxxxxxxxxxx') from(select rownum rid,addr from v$latch_children where name='cache buffers chains'order by
addr) a, (select rownum rid,addr from v$latch_children wherename='cache buffers chains' order by addr) b where a.rid=b.rid+1 andrownum<=1;

 

TO_NUMBER(B.ADDR,'XXXXXXXXXXXXXXXXXXXXX')-TO_NUMBER(A.ADDR,'XXXXXXXXXXXXXXXXXXXXX')

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

                                                                                             192

每个CBC Latch的大小为192个字节。

释放Buffer Pin锁的时候,还要修改BH中的Buffer Pin锁,同样需要CBCLatch保护。

3.  CBC Latch竞争

l  多个进程以不兼容模式申请某一CBC Latch,访问此CBC Latch保护的不同链表和不同BH

l  多个进程以不兼容模式申请某一CBC Latch,访问此CBC Latch保护的同一链表和同一BH

热链和热块竞争。

热链竞争可以通过修改_db_block_hash_buckets和_db_block_hash_latches来控制BUCKETS 和LATCH数量,重新计算BUCKET和BH的对应关系。

 

 

 

 

 

 

 

 

 

        

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: