Oracle資料庫開發——深入索引結構
要想研究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
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫開發——瞭解索引Oracle資料庫索引
- 資料庫索引背後的資料結構資料庫索引資料結構
- 深入理解MySQL索引底層資料結構MySql索引資料結構
- Oracle 資料庫 結構Oracle資料庫
- Oracle資料庫索引使用及索引失效總結 轉Oracle資料庫索引
- 索引資料結構索引資料結構
- 達夢資料庫索引結構詳解資料庫索引
- 資料庫索引中包含的資料結構有哪些資料庫索引資料結構
- ORACLE資料庫開發經驗總結Oracle資料庫
- Oracle資料庫體系結構Oracle資料庫
- 簡述oracle資料庫結構Oracle資料庫
- SQL Server Page資料庫結構深入分析SQLServer資料庫
- Oracle 資料庫體系結構解析Oracle資料庫
- Oracle 資料庫體系結構 (上)Oracle資料庫
- Agile PLM資料庫表結構(Oracle)資料庫Oracle
- Oracle資料庫開發——序列Oracle資料庫
- Redis深入之資料結構Redis資料結構
- 索引學習筆記-1(Oracle9i/10g程式設計藝術-深入資料庫體系結構)索引筆記Oracle程式設計資料庫
- 【Mysql】索引底層資料結構MySql索引資料結構
- 資料結構之索引堆(IndexHeap)資料結構索引Index
- Oracle - 資料庫的記憶體結構Oracle資料庫記憶體
- 初識Oracle資料庫體系結構Oracle資料庫
- dump Oracle資料庫的內部結構Oracle資料庫
- Oracle例項和Oracle資料庫(Oracle體系結構)Oracle資料庫
- Oracle資料庫索引管理規範Oracle資料庫索引
- Oracle資料庫開發——表(概念)Oracle資料庫
- Oracle資料庫開發指南(二)Oracle資料庫
- ORACLE資料庫開發經驗Oracle資料庫
- oracle index索引結構(一)OracleIndex索引
- 深入瞭解Redis資料結構Redis資料結構
- Oracle9i&10g程式設計藝術-深入資料庫體系結構Oracle程式設計資料庫
- 乾貨:mysql索引的資料結構MySql索引資料結構
- 關於Mysql索引的資料結構MySql索引資料結構
- MySQL-06.索引的資料結構MySql索引資料結構
- 瞭解oracle資料庫體系結構(3)Oracle資料庫
- 瞭解oracle資料庫體系結構(2)Oracle資料庫
- 瞭解oracle資料庫體系結構(1)Oracle資料庫
- mysql資料庫-資料結構MySql資料庫資料結構