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的索引结构我取出其中一个块进行分析如下:
Leaf block dump
?===============
?header address 47520285706852=0x2b382dbfca64
?kdxcolev 0
?KDXCOLEV Flags = - - -
?kdxcolok 0
?kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y
?kdxconco 4
?kdxcosdc 0
?kdxconro 2
?kdxcofbo 40=0x28
?kdxcofeo 950=0x3b6
?kdxcoavs 910
?kdxlespl 0
?kdxlende 0
?kdxlenxt 20971653=0x1400085
?kdxleprv 0=0x0
?kdxledsz 0
?kdxlebksz 8032
row#0[4492] flag: ------, lock: 0, len=3540
?col 0; len 2; (2):? c1 02
?col 1; len 6; (6):? 01 00 03 43 00 00
?col 2; len 6; (6):? 01 00 03 7c 00 3f
?col 3; len 3519; (3519):
? cf 49 92 24 49 92 24 49 92 cf 24 49 92 24 49 92 24 49 cf 92 24 49 92 24 49
? .....
? 49 92 24 49 92 24 49 92 02 ff 1e 49 92 24 49 92 24 49 92
?row#1[950] flag: ------, lock: 0, len=3542
?col 0; len 2; (2):? c1 02
?col 1; len 6; (6):? 01 00 03 7c 00 40
?col 2; len 6; (6):? 01 00 06 36 00 7f
?col 3; len 3521; (3521):
? cf 24 49 92 24 49 92 24 49 cf 92 24 49 92 24 49 92 24 cf 49 92 24 49 92 24
? .....
? 92 02 ff 1e 49 92 24 49 92 24 49 92 cf 24 49 92 24 49 92 24 49
?
由于在位图索引中每一个键值被压缩为键值+ROWID范围+位图键的方式,这里对于row#0
可以看到
col 0; len 2; (2):? c1 02为键值
col 1; len 6; (6):? 01 00 03 43 00 00
?col 2; len 6; (6):? 01 00 03 7c 00 3f
为ROWID的范围
col 3; len 3519 就是他的位图键,由于位图键非常长,我们主要取出
cf 49 92 24 49 92 24 49 92
这个片段进行分析
?首先cf应该是一个标示位(作用未知)
?剩下的
49 92 24 49 92 24 49 92 我们进行分析,实际上这里每一个FF代表了一个字节,一个字节8位FF代表是的11111111
?SQL> select to_number('49','xxxxxxxxxxxxxx') from dual;
?TO_NUMBER('49','XXXXXXXXXXXXXX
?------------------------------
? ? ? ? ? ? ? ? ? ?