1.   理解cache buffer中几个关键性的概念

    Oracle SGA的主要结构就是cache buffer,其通常会占据整个SGA的大部分内存,对于OLTP架构而言。 理解cache buffer之前,我们需要
先理解其涉及的几个概念。

 1)  链表(双向链表)
 2)  hash操作
 3)  bucket




从图中我们可以看到,一个latch:cache buffers chains(x$bh.hladdr) 可以保护多个Hash Bucket,也就是说,如果我要访问某个block,我首先要获得这个latch,

一个Hash Bucket对应一个Hash Chain List,


而这个Hash Chain List挂载了一个或者多个Buffer Header。



++++ 9.2.0.8
SQL&get; show parameter db_block_hash

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
_db_block_hash_buckets               integer     15667
_db_block_hash_latches               integer     1024

大家可以看到,9208中默认的bucket是比较多的,高达15667个,latch是1024,换句话讲,每个latch可以保护16个buckets。

++++10.2.0.5
SQL&get; show parameter db_block_hash

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
_db_block_hash_buckets               integer     65536
_db_block_hash_latches               integer     2048
SQL&get;

在10.2.0.5版本中,默认是buckets个数是64k,latch是2048个,即每个latch可以保护32个 bucket,这比9208版本高 了一倍。


++++11.2.0.2
SQL&get; show parameter db_block_hash

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
_db_block_hash_buckets               integer     262144
_db_block_hash_latches               integer     8192

在11.2.0.2 版本中,默认参数值又有所改变,但是仍然是一个latch保护32个bucket。bucket越多,其实可以进一步降低争用,对于高并发环境来讲。