ITPub博客

首页 > 数据库 > Oracle > Oracle数据库开发——深入索引结构

Oracle数据库开发——深入索引结构

原创 Oracle 作者:呆呆笨笨的鱼 时间:2014-05-16 13:44:10 0 删除 编辑
要想研究oracle索引 B-Tree索引的的结构和原理必须要用到下面这几句话:
alter session set events 'immediate trace name treedump level 元数据段ID(object_id)';
select dbms_utility.data_block_address_file('') from dual;
select dbms_utility.data_block_address_block('16777420') from dual;
alter system dump datafile 文件号 block 块号;

准备测试数据表:
SQL> create table tt tablespace users as select * from dba_objects;
 
Table created
 
SQL> select count(1) from tt;
 
  COUNT(1)
----------
     14250
 
SQL> insert into tt select * from tt;
 
14250 rows inserted
 
SQL> insert into tt select * from tt;
 
28500 rows inserted
 
SQL> select count(1) from tt;
 
  COUNT(1)
----------
     57000
     
在测试表object_id列上创建B-Tree 索引:
SQL> create index tt_idx on tt(object_id) tablespace users;
 
Index created


查询索引 tt_idx 元数据段ID,数据段ID:
SQL> select object_id ,data_object_id from dba_objects where object_name = 'TT_IDX';
 
 OBJECT_ID DATA_OBJECT_ID
---------- --------------
     15740          15740


找到trace文件打开: 
----- begin tree dump
branch: 0x10000cb 16777419 (0: nrow: 122, level: 1)
   leaf: 0x10000cc 16777420 (-1: nrow: 505 rrow: 505)
   leaf: 0x10000cd 16777421 (0: nrow: 479 rrow: 479)
   leaf: 0x10000ce 16777422 (1: nrow: 479 rrow: 479)
   leaf: 0x10000cf 16777423 (2: nrow: 479 rrow: 479)
   leaf: 0x10001e8 16777704 (3: nrow: 478 rrow: 478)
   leaf: 0x10001e9 16777705 (4: nrow: 479 rrow: 479)
   leaf: 0x10001ea 16777706 (5: nrow: 479 rrow: 479)
   leaf: 0x10001eb 16777707 (6: nrow: 479 rrow: 479)
   leaf: 0x10001ec 16777708 (7: nrow: 479 rrow: 479)
   leaf: 0x10001ed 16777709 (8: nrow: 479 rrow: 479)
   leaf: 0x10001ee 16777710 (9: nrow: 479 rrow: 479)
   leaf: 0x10001ef 16777711 (10: nrow: 479 rrow: 479)
   leaf: 0x10001f1 16777713 (11: nrow: 479 rrow: 479)
   leaf: 0x10001f2 16777714 (12: nrow: 479 rrow: 479)
   leaf: 0x10001f3 16777715 (13: nrow: 479 rrow: 479)
   leaf: 0x10001f4 16777716 (14: nrow: 479 rrow: 479)
   leaf: 0x10001f5 16777717 (15: nrow: 479 rrow: 479)
   leaf: 0x10001f6 16777718 (16: nrow: 479 rrow: 479)
   leaf: 0x10001f7 16777719 (17: nrow: 479 rrow: 479)
   leaf: 0x10001f8 16777720 (18: nrow: 479 rrow: 479)
   leaf: 0x10001f9 16777721 (19: nrow: 479 rrow: 479)
   leaf: 0x10001fa 16777722 (20: nrow: 479 rrow: 479)
   leaf: 0x10001fb 16777723 (21: nrow: 479 rrow: 479)
   leaf: 0x10001fc 16777724 (22: nrow: 479 rrow: 479)
   leaf: 0x10001fd 16777725 (23: nrow: 479 rrow: 479)
   leaf: 0x10001fe 16777726 (24: nrow: 479 rrow: 479)
   leaf: 0x10001ff 16777727 (25: nrow: 479 rrow: 479)
   leaf: 0x1000481 16778369 (26: nrow: 479 rrow: 479)
   leaf: 0x1000482 16778370 (27: nrow: 479 rrow: 479)
   leaf: 0x1000483 16778371 (28: nrow: 479 rrow: 479)
   leaf: 0x1000484 16778372 (29: nrow: 479 rrow: 479)
   leaf: 0x1000485 16778373 (30: nrow: 479 rrow: 479)
   leaf: 0x1000486 16778374 (31: nrow: 479 rrow: 479)
   leaf: 0x1000487 16778375 (32: nrow: 479 rrow: 479)
   leaf: 0x1000488 16778376 (33: nrow: 479 rrow: 479)
   leaf: 0x1000489 16778377 (34: nrow: 479 rrow: 479)
   leaf: 0x100048a 16778378 (35: nrow: 479 rrow: 479)
   leaf: 0x100048b 16778379 (36: nrow: 479 rrow: 479)
   leaf: 0x100048c 16778380 (37: nrow: 479 rrow: 479)
   leaf: 0x100048d 16778381 (38: nrow: 479 rrow: 479)
   leaf: 0x100048e 16778382 (39: nrow: 479 rrow: 479)
   leaf: 0x100048f 16778383 (40: nrow: 479 rrow: 479)
   leaf: 0x1000491 16778385 (41: nrow: 479 rrow: 479)
   leaf: 0x1000492 16778386 (42: nrow: 479 rrow: 479)
   leaf: 0x1000493 16778387 (43: nrow: 479 rrow: 479)
   leaf: 0x1000494 16778388 (44: nrow: 479 rrow: 479)
   leaf: 0x1000495 16778389 (45: nrow: 479 rrow: 479)
   leaf: 0x1000496 16778390 (46: nrow: 479 rrow: 479)
   leaf: 0x1000497 16778391 (47: nrow: 479 rrow: 479)
   leaf: 0x1000498 16778392 (48: nrow: 479 rrow: 479)
   leaf: 0x1000499 16778393 (49: nrow: 479 rrow: 479)
   leaf: 0x100049a 16778394 (50: nrow: 479 rrow: 479)
   leaf: 0x100049b 16778395 (51: nrow: 479 rrow: 479)
   leaf: 0x100049c 16778396 (52: nrow: 479 rrow: 479)
   leaf: 0x100049d 16778397 (53: nrow: 479 rrow: 479)
   leaf: 0x100049e 16778398 (54: nrow: 479 rrow: 479)
   leaf: 0x100049f 16778399 (55: nrow: 479 rrow: 479)
   leaf: 0x10004a1 16778401 (56: nrow: 479 rrow: 479)
   leaf: 0x10004a2 16778402 (57: nrow: 479 rrow: 479)
   leaf: 0x10004a3 16778403 (58: nrow: 479 rrow: 479)
   leaf: 0x10004a4 16778404 (59: nrow: 479 rrow: 479)
   leaf: 0x10004a5 16778405 (60: nrow: 479 rrow: 479)
   leaf: 0x10004a6 16778406 (61: nrow: 479 rrow: 479)
   leaf: 0x10004a7 16778407 (62: nrow: 479 rrow: 479)
   leaf: 0x10004a8 16778408 (63: nrow: 479 rrow: 479)
   leaf: 0x10004a9 16778409 (64: nrow: 479 rrow: 479)
   leaf: 0x10004aa 16778410 (65: nrow: 479 rrow: 479)
   leaf: 0x10004ab 16778411 (66: nrow: 479 rrow: 479)
   leaf: 0x10004ac 16778412 (67: nrow: 479 rrow: 479)
   leaf: 0x10004ad 16778413 (68: nrow: 479 rrow: 479)
   leaf: 0x10004ae 16778414 (69: nrow: 479 rrow: 479)
   leaf: 0x10004af 16778415 (70: nrow: 479 rrow: 479)
   leaf: 0x10004b1 16778417 (71: nrow: 479 rrow: 479)
   leaf: 0x10004b2 16778418 (72: nrow: 479 rrow: 479)
   leaf: 0x10004b3 16778419 (73: nrow: 479 rrow: 479)
   leaf: 0x10004b4 16778420 (74: nrow: 479 rrow: 479)
   leaf: 0x10004b5 16778421 (75: nrow: 479 rrow: 479)
   leaf: 0x10004b6 16778422 (76: nrow: 479 rrow: 479)
   leaf: 0x10004b7 16778423 (77: nrow: 479 rrow: 479)
   leaf: 0x10004b8 16778424 (78: nrow: 479 rrow: 479)
   leaf: 0x10004b9 16778425 (79: nrow: 479 rrow: 479)
   leaf: 0x10004ba 16778426 (80: nrow: 450 rrow: 450)
   leaf: 0x10004bb 16778427 (81: nrow: 449 rrow: 449)
   leaf: 0x10004bc 16778428 (82: nrow: 449 rrow: 449)
   leaf: 0x10004bd 16778429 (83: nrow: 449 rrow: 449)
   leaf: 0x10004be 16778430 (84: nrow: 449 rrow: 449)
   leaf: 0x10004bf 16778431 (85: nrow: 449 rrow: 449)
   leaf: 0x10004c1 16778433 (86: nrow: 449 rrow: 449)
   leaf: 0x10004c2 16778434 (87: nrow: 449 rrow: 449)
   leaf: 0x10004c3 16778435 (88: nrow: 449 rrow: 449)
   leaf: 0x10004c4 16778436 (89: nrow: 449 rrow: 449)
   leaf: 0x10004c5 16778437 (90: nrow: 449 rrow: 449)
   leaf: 0x10004c6 16778438 (91: nrow: 449 rrow: 449)
   leaf: 0x10004c7 16778439 (92: nrow: 449 rrow: 449)
   leaf: 0x10004c8 16778440 (93: nrow: 449 rrow: 449)
   leaf: 0x10004c9 16778441 (94: nrow: 449 rrow: 449)
   leaf: 0x10004ca 16778442 (95: nrow: 449 rrow: 449)
   leaf: 0x10004cb 16778443 (96: nrow: 449 rrow: 449)
   leaf: 0x10004cc 16778444 (97: nrow: 449 rrow: 449)
   leaf: 0x10004cd 16778445 (98: nrow: 449 rrow: 449)
   leaf: 0x10004ce 16778446 (99: nrow: 449 rrow: 449)
   leaf: 0x10004cf 16778447 (100: nrow: 449 rrow: 449)
   leaf: 0x10004d1 16778449 (101: nrow: 449 rrow: 449)
   leaf: 0x10004d2 16778450 (102: nrow: 449 rrow: 449)
   leaf: 0x10004d3 16778451 (103: nrow: 449 rrow: 449)
   leaf: 0x10004d4 16778452 (104: nrow: 449 rrow: 449)
   leaf: 0x10004d5 16778453 (105: nrow: 449 rrow: 449)
   leaf: 0x10004d6 16778454 (106: nrow: 449 rrow: 449)
   leaf: 0x10004d7 16778455 (107: nrow: 449 rrow: 449)
   leaf: 0x10004d8 16778456 (108: nrow: 449 rrow: 449)
   leaf: 0x10004d9 16778457 (109: nrow: 449 rrow: 449)
   leaf: 0x10004da 16778458 (110: nrow: 449 rrow: 449)
   leaf: 0x10004db 16778459 (111: nrow: 449 rrow: 449)
   leaf: 0x10004dc 16778460 (112: nrow: 449 rrow: 449)
   leaf: 0x10004dd 16778461 (113: nrow: 449 rrow: 449)
   leaf: 0x10004de 16778462 (114: nrow: 449 rrow: 449)
   leaf: 0x10004df 16778463 (115: nrow: 449 rrow: 449)
   leaf: 0x1000502 16778498 (116: nrow: 449 rrow: 449)
   leaf: 0x1000503 16778499 (117: nrow: 449 rrow: 449)
   leaf: 0x1000504 16778500 (118: nrow: 449 rrow: 449)
   leaf: 0x1000505 16778501 (119: nrow: 449 rrow: 449)
   leaf: 0x1000506 16778502 (120: nrow: 215 rrow: 215)
----- end tree dump


branch是树枝(最根部的树枝为根ROOT),leaf是叶子节点

来看一张图:


下面以第一个叶子节点为例来分析:
leaf: 0x10000cc 16777420 (-1: nrow: 505 rrow: 505)

0x10000cc:为数据块的地址
地址有数据文件号和快编号组成。
0x10000cc是16进制数,16777420是对应它的十进制数

验证一下:
SQL> select to_number('10000cc','xxxxxxx') from dual;
 
TO_NUMBER('10000CC','XXXXXXX')
------------------------------
                      16777420
                      
 接下来求叶子节点的 数据文件号和快编号
 这里要用到一个包 dbms_utility                     


求文件号                      
SQL> select dbms_utility.data_block_address_file('16777420') from dual;
 
DBMS_UTILITY.DATA_BLOCK_ADDRES
------------------------------
                             4
求块号
SQL> select dbms_utility.data_block_address_block('16777420') from dual;
 
DBMS_UTILITY.DATA_BLOCK_ADDRES
------------------------------
                           204     
                           
那么现在我们就知道了, 叶子节点 leaf: 0x10000cc 16777420 (-1: nrow: 505 rrow: 505) 存放在4号文件的第204个数据块上!?


验证一下:
SQL> select * from dba_extents where segment_name='TT_IDX';
 
OWNER       SEGMENT_NAME     PARTITION_NAME    SEGMENT_TYPE       TABLESPACE_NAME    EXTENT_ID    FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO
----------- ---------------- ----------------- ------------------ ----------------- ---------- ---------- ---------- ---------- ---------- ------------
ZHANGBIN    TT_IDX                             INDEX              USERS                      0          4        200      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                      1          4        488      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                      2          4        496      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                      3          4        504      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                      4          4       1152      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                      5          4       1160      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                      6          4       1168      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                      7          4       1176      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                      8          4       1184      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                      9          4       1192      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                     10          4       1200      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                     11          4       1208      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                     12          4       1216      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                     13          4       1224      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                     14          4       1232      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                     15          4       1240      65536          8            4
ZHANGBIN    TT_IDX                             INDEX              USERS                     16          4       1280    1048576        128            4


FILE_ID 全部是4 肯定是在4号文件上,BLOCK_ID = 200 连续8个块  ,包括了204这个块
    所以确实 leaf: 0x10000cc 16777420 (-1: nrow: 505 rrow: 505) 存放在4号文件的第204个数据块上 

接下来把4号文件的第204个数据块dump下来,看一下具体内容


SQL> alter system dump datafile 4 block 204;
 
System altered


这里我只取了部分dump结果
Leaf block dump
===============
header address 234390116=0xdf88264
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y
kdxconco 2
kdxcosdc 0
kdxconro 505
kdxcofbo 1046=0x416
kdxcofeo 1867=0x74b
kdxcoavs 821
kdxlespl 0
kdxlende 0
kdxlenxt 16777421=0x10000cd
kdxleprv 0=0x0
kdxledsz 0
kdxlebksz 8036
row#0[8024] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 03
col 1; len 6; (6):  01 00 01 6b 00 30
row#1[8012] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 03
col 1; len 6; (6):  01 00 02 60 00 30
row#2[8000] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 03
col 1; len 6; (6):  01 00 03 1c 00 3b
row#3[7988] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 03
col 1; len 6; (6):  01 00 03 fb 00 45
row#4[7976] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 04
col 1; len 6; (6):  01 00 01 6b 00 05
row#5[7964] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 04
col 1; len 6; (6):  01 00 02 60 00 05
row#6[7952] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 04
col 1; len 6; (6):  01 00 03 1c 00 10
row#7[7940] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 04
col 1; len 6; (6):  01 00 03 fb 00 1a
row#8[7928] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 05
col 1; len 6; (6):  01 00 01 6b 00 31
row#9[7916] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 05
col 1; len 6; (6):  01 00 02 60 00 31
row#10[7904] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 05
col 1; len 6; (6):  01 00 03 1c 00 3c
row#11[7892] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 05
col 1; len 6; (6):  01 00 03 fb 00 46
row#12[7880] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 06
col 1; len 6; (6):  01 00 01 6b 00 1a
row#13[7868] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 06
col 1; len 6; (6):  01 00 02 60 00 1a
row#14[7856] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 06
col 1; len 6; (6):  01 00 03 1c 00 25
row#15[7844] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 06
col 1; len 6; (6):  01 00 03 fb 00 2f
row#16[7832] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 07
col 1; len 6; (6):  01 00 01 6b 00 15
row#17[7820] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 07
col 1; len 6; (6):  01 00 02 60 00 15
row#18[7808] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 07
col 1; len 6; (6):  01 00 03 1c 00 20
row#19[7796] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 07
col 1; len 6; (6):  01 00 03 fb 00 2a
row#20[7784] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 08
col 1; len 6; (6):  01 00 01 6b 00 11
row#21[7772] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 08
col 1; len 6; (6):  01 00 02 60 00 11
row#22[7760] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 08
col 1; len 6; (6):  01 00 03 1c 00 1c
row#23[7748] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 08
col 1; len 6; (6):  01 00 03 fb 00 26
row#24[7736] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 09
col 1; len 6; (6):  01 00 01 6b 00 24
row#25[7724] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 09
col 1; len 6; (6):  01 00 02 60 00 24
row#26[7712] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 09
col 1; len 6; (6):  01 00 03 1c 00 2f
row#27[7700] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 09
col 1; len 6; (6):  01 00 03 fb 00 39
row#28[7688] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 0a
col 1; len 6; (6):  01 00 01 6b 00 0d
row#29[7676] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 0a
col 1; len 6; (6):  01 00 02 60 00 0d
row#30[7664] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 0a
col 1; len 6; (6):  01 00 03 1c 00 18
row#31[7652] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 0a
col 1; len 6; (6):  01 00 03 fb 00 22
row#32[7640] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 0b
col 1; len 6; (6):  01 00 01 6b 00 25
row#33[7628] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 0b
col 1; len 6; (6):  01 00 02 60 00 25
row#34[7616] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 0b
col 1; len 6; (6):  01 00 03 1c 00 30
row#35[7604] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 0b
col 1; len 6; (6):  01 00 03 fb 00 3a
row#36[7592] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 0c
col 1; len 6; (6):  01 00 01 6b 00 38       




这里取前两行来看
第一行
row#0[8024] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 03
col 1; len 6; (6):  01 00 01 6b 00 30
第二行
row#1[8012] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 03
col 1; len 6; (6):  01 00 02 60 00 30    


解释下:
row#0[8024] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 03                      --第1行的第1列
col 1; len 6; (6):  01 00 01 6b 00 30          --第1行的第2列


row#1[8012] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 03                       --第2行的第1列
col 1; len 6; (6):  01 00 02 60 00 30           --第2行的第2列


这样就知道了索引 TT_IDX 的数据块里面一行数据存储了两列


下一个疑问,这两列分别是什么值呢?
通过创建索引的列object_id ,可以推测,第一列是object_id的值。
因为我们知道,索引rowid密切相关,其实第二列就是数据rowid的值。


是不是呢?通过转换来验证: (这里要用到包Utl_Raw.cast_to_number())
SQL> select Utl_Raw.cast_to_number('c103') from dual;
 
UTL_RAW.CAST_TO_NUMBER('C103')
------------------------------
                             2


SQL> select rowid,object_id from tt where object_id = 2 order by rowid;
 
ROWID               OBJECT_ID
------------------ ----------
AAAD17AAEAAAAFrAAw          2
AAAD17AAEAAAAJgAAw          2
AAAD17AAEAAAAMcAA7          2
AAAD17AAEAAAAP7ABF          2


上面两条语句,第一条说明 索引列值为2


                第二条说明 数据表中索引列object_id = 2 的数据一共有4条数据
                
因此,只需要验证
 16进制数 01 00 01 6b 00 30 
与 64进制数 AAAD17AAEAAAAFrAAw  相等即可


注意:这里是因为按照ROWID排序了,我们取的正好又是dump文件的第一行(创建索引适合索引值会按照索引值和rowid排序)。
  所以16进制数 01 00 01 6b 00 30 与 64进制数 AAAD17AAEAAAAFrAAw一定是对应的。
  
验证:
16进制数转换:
16进制数 01 00 01 6b 00 30 先转成2进制数 00000001 00|000000 00000001 01101011| 00000000 00110000 
(1)这个2进制数的前10位:表示的是文件号
    将00000001 00转换成10进制数 是4,即4号文件
(2)接下来的22位:表示的是块编号
    将000000 00000001 01101011 转换成10进制数 是 363 ,即数据块号363
(3)最后16为所在数据块的行号 00000000 00110000 转换成10进制数 是 48
    
下面看rowid转换:
rowid是一个64进制数,一共18位,
其中前6表示数据段的编号,接下来的3位表示相对文件编号,再下来的6位是块编号,最后3位是相对块的行编号。


即:
OOOOOO(Data Object Number) FFF(relative file number相对表空间的文件编号) BBBBBB(Block Number) RRR(Row number)


SQL> select dbms_rowid.rowid_relative_fno('AAAD17AAEAAAAJgAAw') from dual;
 
DBMS_ROWID.ROWID_RELATIVE_FNO(
------------------------------
                             4


SQL> select dbms_rowid.rowid_block_number('AAAD17AAEAAAAFrAAw') from dual;
 
DBMS_ROWID.ROWID_BLOCK_NUMBER(
------------------------------
                           363
                           
SQL> select dbms_rowid.rowid_row_number('AAAD17AAEAAAAJgAAw') from dual;
 
DBMS_ROWID.ROWID_ROW_NUMBER('A
------------------------------
                            48                           

结果是完全一致的,所以:
索引的结构由索引列值,ROWID(确切的说是rowid的后三部分组成)。


下面再看
SQL> select rowid,object_id from tt where object_id = 2 order by rowid;
 
ROWID               OBJECT_ID
------------------ ----------
AAAD17AAEAAAAFrAAw          2
AAAD17AAEAAAAJgAAw          2
AAAD17AAEAAAAMcAA7          2
AAAD17AAEAAAAP7ABF          2       


Object_id = 2 的数据(c1 03) 一共4条,那么索引内容中同样有4条记录,而且是排好序的!
如dump结果
kdxlebksz 8036
row#0[8024] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 03
col 1; len 6; (6):  01 00 01 6b 00 30
row#1[8012] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 03
col 1; len 6; (6):  01 00 02 60 00 30
row#2[8000] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 03
col 1; len 6; (6):  01 00 03 1c 00 3b
row#3[7988] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 03
col 1; len 6; (6):  01 00 03 fb 00 45
row#4[7976] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 04
col 1; len 6; (6):  01 00 01 6b 00 05
row#5[7964] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 04
col 1; len 6; (6):  01 00 02 60 00 05        


            

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

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

注册时间:2014-04-17

  • 博文量
    62
  • 访问量
    939480