buffercache实验1-内存结构图解(二)

2014-11-24 08:28:57 · 作者: · 浏览: 11
------ ---------- -----
_db_block_hash_buckets Number of database block hash buckets 16384 TRUE FALSE FALSE
_db_block_hash_latches Number of database block hash latches 1024 TRUE FALSE FALSE
SYS@ bys3>show parameter db_block_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192


而一条hash chain上的buffer header数量,没有固定限制(CR块有限制,一条hash chain上的CR块不能超过6个)。从隐含参数_db_block_max_cr_dba中可以查到这个限制:
P_NAME P_DESCRIPTION P_VALUE ISDEFAULT ISMODIFIED ISADJ
---------------------------------------- -------------------------------------------------- ------------------------------ --------- ---------- -----
_db_block_max_cr_dba Maximum Allowed Number of CR buffers per dba 6 TRUE FALSE FALSE

判断是否有过长的hash chain的语句:过长的hash chain更容易引起热链进而引起CBC LATCH
SYS@ bys3>select * from (select hladdr,count(*) from x$bh group by hladdr order by 2 desc) where rownum<5; --x$bh.hladdr表示的是hash chain latch address
HLADDR COUNT(*)
-------- ----------
2A3A46CC 14
2A7F0864 14
2A3A4EAC 13
2A7F26EC 12
在热链问题发生时,可以通过两种方法来增加hash chain数量:1、调整隐含参数_db_block_hash_buckets --有风险 2.按ORACLE 10G和11G中,bucket数量的默认值是大于2倍的buffer数量的最小的2的幂的值的公式,来计算出让系统自动调整bucket数量时buffer cache需要增加到的大小。--查出现在的_db_block_hash_buckets 数量,除以2,将得出值乘以当前数据块大小(暂不考虑bh大小,也可以把一个bh大小按1K或512bytes来计算),就可以得出要调整到的buffer cache大小。-- 注意注意:这个调整重启后才生效。
按我测试环境中值来计算:_db_block_hash_buckets 16384 ,db_block_size 8192,一个buffer header按512bytes。想让系统自动调整hash bucket的数量,需要将buffer cache大小调整为大于68M,计算方法如下:
SYS@ bys3>select 16384/2*(8192+512)/1024/1024 "Desired size" from dual;
Desired size
------------
68
当然了,这种调整buffer cache大小进而增大hash bucket数量的方法是治标了,引起热链问题,不良SQL语句或者高并发是主因,要想从根本上解决热链问题,就要从这些方面入手解决了。--不过要真是buffer cache过小,还是要在系统内存资源允许情况下增大点好。
###########################

3.hash latch:就是latch:cache buffers chains --CBC LATCH

用于保护hash chain结构,一个CBC LATCH管理着多个hash chain。
用到此LATCH的场景:
1.服务进程需要扫描hash chain上的buffer header时或者叫要读取buffer cache中数据块,
2.服务器进程要将新读入的数据块挂载到hash chain上时,

我的测试系统中:hash_buckets 个数是16384 ,CBC LATCH数量是1024,计算出一个CBC LATCH要管理16个hash_chain

P_NAME P_DESCRIPTION P_VALUE ISDEFAULT ISMODIFIED ISADJ
---------------------------------------- -------------------------------------------------- ------------------------------ --------- ---------- -----
_db_block_hash_buckets Number of database block hash buckets 16384 TRUE FALSE FALSE
_db_block_hash_latches Number of database block hash latches 1024 TRUE FALSE FALSE
SYS@ bys3>select count(*) from v$latch_children where name like '%cache buffers chains%';
COUNT(*)
----------
1024
SYS@ bys3>select 16384/1024 from dual;
16384/1024
----------
16

#############################################################################

4.Data Buffer Cache多缓冲池技术:

指根据数据的不同访问方式,将Data Buffer Cache分为Default,Keep,Recycle. Default 池则存放未指定存储池 的数据,按照LRU算法管理。Keep 池中 数据倾向于一直保存,可存放经常使用的数据,Recycle池中数据倾向于即时老化,可以存放一次性读取使用的数据。默认所有表(未指定存储的池)使用Default池,大小是数据缓冲区大小。
创建或修改表进指定:alter table test storage(buffer_pool keep);
BUFFER_POOL { KEEP | RECYCLE | DEFAULT }
语句在10G官方文档-SQL Reference---alter table---storage_clause
ORACLE 9I后一个 数据库可以存在2K/4K/8K/16K/32K这五种大小的block,db_block_size 定义的是主block_size。
如果要在数据库中创建不同block_size的表空间,就要设置db_nk_cache_size参数。
每个pool会有至少8个“Latch:cache buffers lru chain”.

5.working set:

每个working s