ITPub博客

首页 > Linux操作系统 > Linux操作系统 > index block internal tips

index block internal tips

原创 Linux操作系统 作者:NinGoo 时间:2019-06-05 15:51:05 0 删除 编辑

index block和data block一样都是属于06类型的block(参考http://ningoo.itpub.net/post/2149/277126),所以两者的格式基本上相差不大,头部都是20字节的cache header,加上24字节的transaction header control,加上24字节的ITL × ITC, 差异主要是data area部分。两者通过transaction header control部分的头两个字节,也就是的21,22字节来区分,1表示data,2表示index。

对于cache header和transaction header,可以参考http://www.ixora.com.au/q+a/datablock.htm#end


index block主要分为:index branch block和index leaf block。

当然,对于B*Tree index ,Bitmap index和IOT,其block格式是不一样的,主要的差别还是在数据存储部分。

即使同是B*Tree index,unique和non unique的leaf block的数据存储方式也是有区别的。unique将rowid信息保存在row header中,non unique则将rowid信息保存为最后一个column。对于unique block,其kdxledsz=6表示rowid的长度。

其中branch block的data header为24字节,而leaf block则有32字节。

index leaf block中,每个index entry,也是按照row header + len + data + len + data...的方式,如果column data的长度少于128,则len本身占用一个字节,否则占用2个字节,并且第一个字节的最高位为1,也就是通过判断第一个长度字节的最高位可以知道该len是一个字节的,还是两个字节的。正是由于第一个字节只有7个bit来表示长度,所以超过127后需要使用第二个字节。

而在data block中,column data长度小于等于250时,len占用1个字节,否则占用3个字节,并且第一个字节被设置成FE(试验观察,未严格证明)。至于这里为什么和index不一样,就不得而知了。

下面通过一个简单的试验来验证上述说法:

SYS@ning>create table t(id int, a char(127),b char(128));

Table created.

SYS@ning>create index ix_t on t(a);

Index created.

SYS@ning>create index ix_t2 on t(b);

Index created.

SYS@ning>insert into t values(1,'a','b');

1 row created.

SYS@ning>select file_id,block_id from dba_extents where segment_name='IX_T';

FILE_ID BLOCK_ID
---------- ----------
5 4

SYS@ning>select file_id,block_id from dba_extents where segment_name='IX_T2';

FILE_ID BLOCK_ID
---------- ----------
5 44

SYS@ning>alter system dump datafile 5 block 7;

System altered.

SYS@ning>alter system dump datafile 5 block 47;

System altered.

Leaf block dump
===============
header address 77800036=0x4a32264
kdxcolev 0 // level 0表示leaf block
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y // 若是IOT 则iot flags为I--
kdxconco 2 // columns in key
kdxcosdc 0 // increment each time block is split or del
kdxconro 1 // rows
kdxcofbo 38=0x26 // free space begin offset
kdxcofeo 7899=0x1edb // free space edn offset
kdxcoavs 7861 // available space in the block
kdxlespl 0
kdxlende 0
kdxlenxt 0=0x0 // next leaf block
kdxleprv 0=0x0 // privious leaf block
kdxledsz 0 // rowid size, only used in unique leaf block, always 6
kdxlebksz 8036
row#0[7899] flag: ------, lock: 0, len=137
col 0; len 127; (127):
61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20
col 1; len 6; (6): 00 40 75 02 00 00 // rowid
----- end of leaf block dump -----

这里可以看到index entry总长度 137 = 2(row header) + 1 (col 0 len) + 127 (col 0 data) + 1(col 1 len) + 6 (col 1 data)

Leaf block dump
===============
header address 77800036=0x4a32264
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y
kdxconco 2
kdxcosdc 0
kdxconro 1
kdxcofbo 38=0x26
kdxcofeo 7897=0x1ed9
kdxcoavs 7859
kdxlespl 0
kdxlende 0
kdxlenxt 0=0x0
kdxleprv 0=0x0
kdxledsz 0
kdxlebksz 8036
row#0[7897] flag: ------, lock: 0, len=139
col 0; len 128; (128):
62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20 20 20
col 1; len 6; (6): 00 40 75 02 00 00
----- end of leaf block dump -----

这里可以看到index entry总长度 139 = 2(row header) + 2 (col 0 len) + 128 (col 0 data) + 1(col 1 len) + 6 (col 1 data)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/193161/viewspace-50325/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2004-12-07

  • 博文量
    117
  • 访问量
    85921