ORACLE (4): buffer cache(1-基础机构)

什么是buffer cache(buffer cache 结构

buffer:是将block拷贝到内存上面,和block一一对应
buffer header:描述buffer的结构,状态,使用情况等,每个buffer都有一个buffer head 包含:dba(data block address)| BA (buffer address)
buffer bucket:是一种维护一组buffer header,有相关联的表空间,文件号,块号的内存结构
(属于 shared pool)
buffer chain:是一种有关系的buffer header的列表
LRU:用来描述或者说指定如何去去空闲的buffer

RBA(redo byte address):sequence number+block number+ offset

buffer cache的作用

a.减少I/O
b.通过构造CR块,从而提供读一致性功能。
c.通过提供各种lock、latch机制,从而提供多个进程并发访问同一个数据块的功能

总体结构:

ORACLE (4): buffer cache(1-基础机构)
其中
Latch ,hash bucket 属于 shared pool
buffer header buffer 属于 buffer cache,(x$bh)

BH的结构:

ORACLE (4): buffer cache(1-基础机构)

对应的内部表:

SQL> desc  X$BH
 Name					   Null?    Type
 ----------------------------------------- -------- ----------------------------
 ADDR						    RAW(8)
 INDX						    NUMBER
 INST_ID					    NUMBER
 HLADDR 					    RAW(8)   --latch的内存地址
 BLSIZ						    NUMBER
 NXT_HASH					    RAW(8)  --hash 链表
 PRV_HASH					    RAW(8)   --hash 链表
 NXT_REPL					    RAW(8)
 PRV_REPL					    RAW(8)
 FLAG						    NUMBER
 FLAG2						    NUMBER
 LOBID						    NUMBER
 RFLAG						    NUMBER
 SFLAG						    NUMBER
 LRU_FLAG					    NUMBER
 TS#						    NUMBER     --表空间
 FILE#						    NUMBER     --文件号
 DBARFIL					    NUMBER   
 DBABLK 					    NUMBER
 CLASS						    NUMBER
 STATE						    NUMBER
 MODE_HELD					    NUMBER
 CHANGES					    NUMBER  
 CSTATE 					    NUMBER
 LE_ADDR					    RAW(8)
 DIRTY_QUEUE					    NUMBER
 SET_DS 					    RAW(8)
 OBJ						    NUMBER
 BA						    RAW(8)
 CR_SCN_BAS					    NUMBER
 CR_SCN_WRP					    NUMBER
 CR_XID_USN					    NUMBER
 CR_XID_SLT					    NUMBER
 CR_XID_SQN					    NUMBER
 CR_UBA_FIL					    NUMBER
 CR_UBA_BLK					    NUMBER
 CR_UBA_SEQ					    NUMBER
 CR_UBA_REC					    NUMBER
 CR_SFL 					    NUMBER
 CR_CLS_BAS					    NUMBER
 CR_CLS_WRP					    NUMBER
 LRBA_SEQ					    NUMBER
 LRBA_BNO					    NUMBER
 HSCN_BAS					    NUMBER
 HSCN_WRP					    NUMBER
 HSUB_SCN					    NUMBER
 US_NXT 					    RAW(8)
 US_PRV 					    RAW(8)
 WA_NXT 					    RAW(8)
 WA_PRV 					    RAW(8)
 OQ_NXT 					    RAW(8)
 OQ_PRV 					    RAW(8)
 AQ_NXT 					    RAW(8)
 AQ_PRV 					    RAW(8)
 OBJ_FLAG					    NUMBER
 TCH						    NUMBER
 TIM						    NUMBER
 CR_RFCNT					    NUMBER
 SHR_RFCNT					    NUMBER

查找记录的BA地址

SQL> select * from  study.test where rownum =1;

ID
------------------------------------------------------------
NAME
--------------------------------------------------------------------------------
1
AAAAAAAAAAA1


SQL> desc dbms_rowid;
FUNCTION ROWID_BLOCK_NUMBER RETURNS NUMBER
 Argument Name			Type			In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ROW_ID 			ROWID			IN
 TS_TYPE_IN			VARCHAR2		IN     DEFAULT
FUNCTION ROWID_CREATE RETURNS ROWID
 Argument Name			Type			In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ROWID_TYPE			NUMBER			IN
 OBJECT_NUMBER			NUMBER			IN
 RELATIVE_FNO			NUMBER			IN
 BLOCK_NUMBER			NUMBER			IN
 ROW_NUMBER			NUMBER			IN
PROCEDURE ROWID_INFO
 Argument Name			Type			In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ROWID_IN			ROWID			IN
 ROWID_TYPE			NUMBER			OUT
 OBJECT_NUMBER			NUMBER			OUT
 RELATIVE_FNO			NUMBER			OUT
 BLOCK_NUMBER			NUMBER			OUT
 ROW_NUMBER			NUMBER			OUT
 TS_TYPE_IN			VARCHAR2		IN     DEFAULT
FUNCTION ROWID_OBJECT RETURNS NUMBER
 Argument Name			Type			In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ROW_ID 			ROWID			IN
FUNCTION ROWID_RELATIVE_FNO RETURNS NUMBER
 Argument Name			Type			In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ROW_ID 			ROWID			IN
 TS_TYPE_IN			VARCHAR2		IN     DEFAULT
FUNCTION ROWID_ROW_NUMBER RETURNS NUMBER
 Argument Name			Type			In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ROW_ID 			ROWID			IN
FUNCTION ROWID_TO_ABSOLUTE_FNO RETURNS NUMBER
 Argument Name			Type			In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ROW_ID 			ROWID			IN
 SCHEMA_NAME			VARCHAR2		IN
 OBJECT_NAME			VARCHAR2		IN
FUNCTION ROWID_TO_EXTENDED RETURNS ROWID
 Argument Name			Type			In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OLD_ROWID			ROWID			IN
 SCHEMA_NAME			VARCHAR2		IN
 OBJECT_NAME			VARCHAR2		IN
 CONVERSION_TYPE		NUMBER(38)		IN
FUNCTION ROWID_TO_RESTRICTED RETURNS ROWID
 Argument Name			Type			In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OLD_ROWID			ROWID			IN
 CONVERSION_TYPE		NUMBER(38)		IN
FUNCTION ROWID_TYPE RETURNS NUMBER
 Argument Name			Type			In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ROW_ID 			ROWID			IN
FUNCTION ROWID_VERIFY RETURNS NUMBER
 Argument Name			Type			In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ROWID_IN			ROWID			IN
 SCHEMA_NAME			VARCHAR2		IN
 OBJECT_NAME			VARCHAR2		IN
 CONVERSION_TYPE		NUMBER(38)		IN

SQL> select dbms_rowid.ROWID_BLOCK_NUMBER(rowid) as bk_num,dbms_rowid.ROWID_RELATIVE_FNO(rowid) as f_num from study.test where rownum =1;

    BK_NUM	F_NUM
---------- ----------
       131	    4


SQL> select HLADDR,TS#,FILE#,STATE,BA from x$bh where FILE# =4  and DBABLK = 131;

HLADDR			TS#	 FILE#	    STATE BA
---------------- ---------- ---------- ---------- ----------------
00000000D03048B8	  4	     4		0 00000000B55AC000


查看BH的大小:

SQL> SELECT   ksppinm, ksppstvl, ksppdesc
FROM   x$ksppi x, x$ksppcv y 
    WHERE   x.indx = y.indx AND  ksppinm like  '%_db_block_buffers%';

KSPPINM
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
KSPPSTVL
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
KSPPDESC
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_db_block_buffers
69090
Number of database blocks cached in memory: hidden parameter


SQL> select t.COMPONENT,t.CURRENT_SIZE/1024/1024  from  v$sga_dynamic_components t where t.COMPONENT ='DEFAULT buffer cache'; 

COMPONENT																							 T.CURRENT_SIZE/1024/1024
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------
DEFAULT buffer cache																								      564  M

则buffer cache为

SQL> select 69090*8/1024 from dual;

69090*8/1024
------------
  539.765625

对应的空间就为bh的大小:

SQL> select (564-539)*1024*1024/69090 from dual;

(564-539)*1024*1024/69090
-------------------------
		379.42394

差不多就是380 字节。

熟悉CBC latch和hash bucket

SQL> SELECT   ksppinm, ksppstvl, ksppdesc
FROM   x$ksppi x, x$ksppcv y
  WHERE   x.indx = y.indx AND  ksppinm like  '%_db_block_hash_buckets%';

KSPPINM
--------------------------------------------------------------------------------
KSPPSTVL
--------------------------------------------------------------------------------
KSPPDESC
--------------------------------------------------------------------------------
_db_block_hash_buckets
262144
Number of database block hash buckets

select  262144/69090 from dual;
	 
在ORACLE11G中,默认值是大于2倍的buffer数量的最小的2的幂的值。举例如buffer数量是69090,2倍就是138180,那么大于1000的最小的2的幂的值是2的18次幂,也就是就会有个262144hash bucket。

对应的latch的大小:
SQL>  SELECT   ksppinm, ksppstvl, ksppdesc
FROM   x$ksppi x, x$ksppcv y  2  
  3    WHERE   x.indx = y.indx AND  ksppinm like  '%_db_block_hash_latches%';

KSPPINM
--------------------------------------------------------------------------------
KSPPSTVL
--------------------------------------------------------------------------------
KSPPDESC
--------------------------------------------------------------------------------
_db_block_hash_latches
8192 
Number of database block hash latches


需要管理的buchet个数:
SQL> select 262144/8192 from dual;

262144/8192
-----------
	 32

测试结果每个latch管理32个bucket