从平衡树到oracle b-tree索引的原理探索(二)
ect dbms_utility.data_block_address_file( 16777661) from dual
DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(16777661)
----------------------------------------------
4
SQL> select dbms_utility.data_block_address_block( 16777661) from dua
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(16777661)
-----------------------------------------------
445
由上,可得:4号文件的第445个块
将tt_index的内容给dump出来一下:
[sql]
SQL> alter system dump datafile 4 block 445;
系统已更改。
www.2cto.com
部分内容摘入如下:
[sql]
row#0[8024] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 03
col 1; len 6; (6): 01 00 01 ac 00 2d
row#1[8012] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 03
col 1; len 6; (6): 01 00 05 36 00 40
row#2[8000] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 03
col 1; len 6; (6): 01 00 08 01 00 1b
row#3[7988] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 03
col 1; len 6; (6): 01 00 0a a2 00 2d
row#4[7976] flag: ------, lock: 0, len=12
col 0; len 2; (2): c1 03
col 1; len 6; (6): 01 00 0d 69 00 48
tt表最小的object_id为2,对应的便是row#0[8024],那么2在oracle中的16进制是如何存储的呢?
[sql]
SQL> select dump(2,16) from dual;
DUMP(2,16)
----------------------------------
Typ=2 Len=2: c1,3
www.2cto.com
由此,可知:2的存储是c1 03.也就是,第0行的第一列存储的值是2.
意味着,在索引的叶子节点里,我们在哪一列上创建索引,其实,oracle就是把该列的值保存到索引的叶子节点里。
索引里第一行第2列16进制数:01 00 01 ac 00 2d和rowid有啥关系呢?
[sql]
SQL> select object_id,rowid from tt
2 where object_id=2
3 order by object_id,rowid;
OBJECT_ID ROWID
---------- ------------------
2 AAAM8xAAEAAAAGsAAt
2 AAAM8xAAEAAAAU2ABA
2 AAAM8xAAEAAAAgBAAb
...
其实,索引里第一行第2列16进制数:01 00 01 ac 00 2d表示的是rowid里面后三部分,也就是:fno、bno、rno。
www.2cto.com
rowid:AAAM8x AAE AAAAGs AAt。通过进制的转换,AAE AAAAGs AAt和01 00 01 ac 00 2d是一样的。
为什么只有后三个部分呢?说白点,书的目录会把书名给包括进去吗?书名就是对象编号、目录就是索引。
到此,我们把索引的内部结构给构造出来:
object_id rowid(后三部分)
... ...
草图如下:
作者 linwaterbin