一、Buffer Cache示意图
这个图只是简单的展示出了一些重要的东西,实际要比这复杂。两条重要的链表,LRU链表和CHECKPOINTQ链表。Buffers的状态,Pinned、Clean、Free or unused、Dirty。一些buffer cache的参数,db_block_size: buffer cache的块大小、db_cache_size:buffer cache大小。db_recycle_cache_size:recycle cache 大小。db_keep_cache_size:keep cache大小。
二、Buffer Cache的内存结构
1、Hash Bucket
2、Cache Buffer Chain
3、Buffer Header
4、LRU链表
5、CheckpointQ、ObjectQ、FileQ
三、Hash Bucket 示意图
四、可用的Buffer Cache是多少呢
隐含参数_db_block_hash_buckets(Number of database block hash buckets)确定hash bucket数量。 我的系统是262144(感觉这个这个不太对,一般比db_block_buffers的两倍大一些,这里大的比较多)
隐含参数_db_block_buffers(Number of database blocks cached in memory)确定用户可用的buffer数量。我的是68985
SQL> select 8192*68985 from dual;
8192*68985
----------
565125120==<用户可用的BUFFER==表的数据>
真正的BUFFER多少大呢?
SQL> show parameter db_cache_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_size big integer 0
###db_cache_size=0 说明数据库使用的是asmm,db_cache_size看不出buffer cache大小,可以用v$sgainfo视图去查看。
SQL> select * from v$sgainfo where name like '%Buffer%';
NAME BYTES RES
-------------------------------- ---------- ---
Redo Buffers 7495680 No
Buffer Cache Size 587202560 Yes
SQL> select 587202560-565125120 from dual;
587202560-565125120
-------------------
22077440===> (管理BUFFER内存==》BUFFER HEADER,BH)
###多出来的buffer是存放bh的。
###v$sga_dynamic_components,v$sga_resize_ops也可以查询当前buffer多大