Oracle的block被映射到SGA
kcbh(kernel cache block header)的对应的block上。
the cache layer:它是block header的第一部分,占用20个bytes。用于检查数据的正确性,即被读的block是否断裂或损坏。它包含如下结构
1. the data block address(DBA)
2. the block type (例如Table/Index, Rollback Segment, Temporary)
3. the block format (8i~9i
都是0x02 10.1.0 2k: 0x62 4k:0x82 8k:0xa2 16k:0xc2 (logfile 0x22 512 bytes))
4. a system change number(SCN)used
for ordering purposes during recovery
the transaction layer: 用户存储数据块里transaction信息的,包含两部分信息
1. 一个是a fixed component ,KTBBH(TRANSACTION FIXED HEADER),包含关于数据块的类型,数据块的最新cleanout时间,ITL(Interested
Transcation List)的数量,空闲列表的链接,还有空闲空间lock。
2. 另一个是 a variable portion,KTBIT(TRANSACTION
VARIABLE HEADER),包含一个进程在一个block里要编辑行所需要的ITLs。默认的包含一个表的数据块只有一个ITL,ITL的多少是通过存储参数INITRANS来设置的,设置较大的值会减少row
data的可用空间,这个参数是可以动态修改的,但只影响新的block,对已经存在的block没有作用(可以用imp/exp,move等方法可以让其对存在的block起作用)
The data layer:包含data header
结构,KDBH(kernel data block header,是DATA
HEADER,占用14bytes),和row data。其中data
header包含表的数量(在表索引中,即table directory),数据行的数量,第一个空闲行的条目(在行索引中,即row
directory),指向空闲区域的开始和结束的偏移量,可用的空闲空间。数据行是从block的底部开始insert的,伴随insert和delete操作,行数据是随机存储的。
如下图所示:
假设初始化5行数据,每行10bytes大小,按offsets排序是5,4,3,2,1。现在删除2,4行,再insert一行20bytes的数据,在row
directory 中slot2被使用,但实际的row data存储在row5之上。这个时候再按offsets排序就是2,5,3,1
。随着你在数据块上的DML操作的越频繁,这种行的随机性就更强。
下面说下data block的设计,如下图所示