Oracle資料庫開發——深入索引結構

呆呆笨笨的魚發表於2014-05-16
要想研究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部落格 ” ,連結:http://blog.itpub.net/28929558/viewspace-1162645/,如需轉載,請註明出處,否則將追究法律責任。

相關文章