关于Oracle位图索引内部浅论(2)

row#0[8044] dba: 16778037=0x1000335
 col 0; len 2; (2):  c1 02
 col 1; len 3; (3):  01 00 03
 col 2; TERM
 row#1[8031] dba: 16778038=0x1000336
 col 0; len 2; (2):  c1 02
 col 1; len 4; (4):  01 00 03 f8
 col 2; TERM
 row#2[8019] dba: 16778039=0x1000337
 col 0; len 2; (2):  c1 03
 col 1; len 3; (3):  01 00 04
 col 2; TERM
 row#3[8006] dba: 16778040=0x1000338
 col 0; len 2; (2):  c1 03
 col 1; len 4; (4):  01 00 04 bf
 col 2; TERM
 row#4[7998] dba: 16778041=0x1000339
 col 0; len 2; (2):  c1 04
 col 1; TERM
 row#5[7985] dba: 16778042=0x100033a
 col 0; len 2; (2):  c1 04
 col 1; len 4; (4):  01 00 05 57
 col 2; TERM
 row#6[7972] dba: 16778043=0x100033b
 col 0; len 2; (2):  c1 04
 col 1; len 4; (4):  01 00 05 f8
 col 2; TERM

这一部分是具体的关于各个叶节点的位置(起始位置的叶节点已经在kdxbrlmc 16778036=0x1000334给出)
 其存储方式为COL0 键值+COL1其对应的表中数据块起始的DBA(可能包含BMB LEVEL1块)
 但是这里
row#4[7998] dba: 16778041=0x1000339
col 0; len 2; (2):  c1 04
col 1; TERM
并未包含实际的表的DBA,为什么未知

Auxillary Map
  --------------------------------------------------------
    Extent 0    :  L1 dba:  0x01000130 Data dba:  0x01000133
    Extent 1    :  L1 dba:  0x01000130 Data dba:  0x01000138
    Extent 2    :  L1 dba:  0x01000140 Data dba:  0x01000141
    Extent 3    :  L1 dba:  0x01000140 Data dba:  0x01000148
    Extent 4    :  L1 dba:  0x01000150 Data dba:  0x01000151
    Extent 5    :  L1 dba:  0x01000150 Data dba:  0x01000158
    Extent 6    :  L1 dba:  0x01000160 Data dba:  0x01000161
    Extent 7    :  L1 dba:  0x01000160 Data dba:  0x01000168
    Extent 8    :  L1 dba:  0x01000170 Data dba:  0x01000171
    Extent 9    :  L1 dba:  0x01000170 Data dba:  0x01000178
    Extent 10    :  L1 dba:  0x01000300 Data dba:  0x01000301
    Extent 11    :  L1 dba:  0x01000300 Data dba:  0x01000308
    Extent 12    :  L1 dba:  0x01000310 Data dba:  0x01000311
    Extent 13    :  L1 dba:  0x01000310 Data dba:  0x01000318
    Extent 14    :  L1 dba:  0x01000320 Data dba:  0x01000321
    Extent 15    :  L1 dba:  0x01000320 Data dba:  0x01000328
    Extent 16    :  L1 dba:  0x01000380 Data dba:  0x01000382
    Extent 17    :  L1 dba:  0x01000400 Data dba:  0x01000402
    Extent 18    :  L1 dba:  0x01000480 Data dba:  0x01000482
    Extent 19    :  L1 dba:  0x01000500 Data dba:  0x01000502
    Extent 20    :  L1 dba:  0x01000580 Data dba:  0x01000582
比如:
row#2[8019] dba: 16778039=0x1000337
 col 0; len 2; (2):  c1 03
 col 1; len 3; (3):  01 00 04 
根据COL 1 01 00 04 实际是01000400,我们在BMB LEVEL3的dump中可以找到
  Extent 17    :  L1 dba:  0x01000400 Data dba:  0x01000402
实际上它是一个BMB LEVEL1块,我们可以看他的数据块实际上是0x01000402
可以进行DUMP这个数据块是否是C1 03这个值
SQL> oradebug setmypid
 Statement processed.
 SQL> oradebug tracefile_name
 /ora11g/diag/rdbms/test/test/trace/test_ora_6108.trc
 SQL>  alter system dump datafile 4 block 1026;
截取第一行
tab 0, row 0, @0x1f89
 tl: 15 fb: --H-FL-- lb: 0x1  cc: 2
 col  0: [ 8]  67 61 6f 70 65 6e 67 32
 col  1: [ 2]  c1 03
 tab 0, row 1, @0x1f7a
可以看到这里的col  1确实为C1 03

接下来取出其中一个块进行分析
 这里为了更方便的论述,我将数据ID的分布变为123123这样的分布而非连续的分布,这样更能清晰看到位图在分布中的变化。如果为连续,那么会全部是是FF这样的出现,根据DUMP的BITMAP的索引结构我取出其中一个块进行分析如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/4e23e85f00f6b5e000a53f9eb9447db3.html