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越多,其实可以进一步降低争用,对于高并发环境来讲。