oracle z中rowid,如何将索引块里面的rowid和表里面的rowid对应起来?
問題:
1、如何將索引塊里面的rowid和表里面的rowid對(duì)應(yīng)起來?
驗(yàn)證如下,請(qǐng)各位大俠指正
建表
SQL> create table test(goodid char(8));
插入記錄
SQL> insert into test nologging select substr(owner,1,8) from all_objects where rownum <=10000;
建索引
SQL> create index goodid_idx on test(goodid);
SQL> select object_id from user_objects
2??where object_name = 'GOODID_IDX';
OBJECT_ID
----------
75096
轉(zhuǎn)儲(chǔ)索引塊
alter session set events 'immediate trace name treedump level 75096';
內(nèi)容如下:
branch: 0x4162d9 4285145 (0: nrow: 28, level: 1)
leaf: 0x4162da 4285146 (-1: nrow: 359 rrow: 359)
leaf: 0x4162db 4285147 (0: nrow: 359 rrow: 359)
...
leaf: 0x4162f4 4285172 (25: nrow: 359 rrow: 359)
leaf: 0x4162f5 4285173 (26: nrow: 307 rrow: 307)
轉(zhuǎn)儲(chǔ)葉子塊
SQL>??select dbms_utility.data_block_address_file(4285146),
2??dbms_utility.data_block_address_block(4285146) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(4285146)
---------------------------------------------
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(4285146)
----------------------------------------------
1
90842
SQL>??alter system dump datafile 1 block 90842;
System altered.
轉(zhuǎn)儲(chǔ)內(nèi)容如下(省略顯示索引頭部):
...
row#0[8014] flag: ------, lock: 0, len=18
col 0; len 8; (8):??4f 52 41 43 4c 45 5f 4f? ?--索引鍵值
col 1; len 6; (6):??00 41 62 d0 00 a4? ?? ?? ?--對(duì)應(yīng)數(shù)據(jù)行的rowid
row#1[7996] flag: ------, lock: 0, len=18
col 0; len 8; (8):??4f 52 41 43 4c 45 5f 4f
col 1; len 6; (6):??00 41 62 d0 00 a5
...
...
row#357[1588] flag: ------, lock: 0, len=18
col 0; len 8; (8):??50 55 42 4c 49 43 20 20
col 1; len 6; (6):??00 41 62 c4 01 29
row#358[1570] flag: ------, lock: 0, len=18
第一個(gè)葉子節(jié)點(diǎn)的第一個(gè)條目索引鍵值轉(zhuǎn)化為字符串
SQL> select
2??chr(to_number('4f','xx')),
3??chr(to_number('52','xx')),
4??chr(to_number('41','xx')),
5??chr(to_number('43','xx')),
6??chr(to_number('4c','xx')),
7??chr(to_number('45','xx')),
8??chr(to_number('5f','xx')),
9??chr(to_number('4f','xx'))
10??from dual;
CHR(TO_N CHR(TO_N CHR(TO_N CHR(TO_N CHR(TO_N CHR(TO_N CHR(TO_N CHR(TO_N
-------- -------- -------- -------- -------- -------- -------- --------
O? ?? ???R? ?? ???A? ?? ???C? ?? ???L? ?? ???E? ?? ???_? ?? ???O
由此可知索引鍵值為??ORACLE_O
根據(jù)該索引鍵值查找記錄對(duì)應(yīng)數(shù)據(jù)行記錄
SQL> select rowid,dbms_rowid.rowid_object(rowid) object_id,
2??dbms_rowid.rowid_relative_fno(rowid) file_id,
3??dbms_rowid.rowid_block_number(rowid) block_id,
4??dbms_rowid.rowid_row_number(rowid) num ,goodid
5??from test
6??where goodid='ORACLE_O';
ROWID? ?? ?? ?? ?? ?OBJECT_ID? ? FILE_ID? ?BLOCK_ID? ?? ???NUM GOODID
------------------ ---------- ---------- ---------- ---------- --------------------
AAASUHAABAAAWLQACk? ?? ?75015? ?? ?? ? 1? ?? ?90832? ?? ???164 ORACLE_O
AAASUHAABAAAWLQACl? ?? ?75015? ?? ?? ? 1? ?? ?90832? ?? ???165 ORACLE_O
AAASUHAABAAAWLQACm? ?? ?75015? ?? ?? ? 1? ?? ?90832? ?? ???166 ORACLE_O
從葉子節(jié)點(diǎn)轉(zhuǎn)儲(chǔ)的內(nèi)容
row#0[8014] flag: ------, lock: 0, len=18
col 0; len 8; (8):??4f 52 41 43 4c 45 5f 4f? ?--索引鍵值
col 1; len 6; (6):??00 41 62 d0 00 a4? ?? ?? ?--對(duì)應(yīng)數(shù)據(jù)行的rowid
可以判斷,索引鍵值ORACLE_O,對(duì)應(yīng)的rowid為,00 41 62 d0 00 a4。
把rowid轉(zhuǎn)為十進(jìn)制
SQL> select
2??to_number('00','xx'),
3??to_number('41','xx'),
4??to_number('62','xx'),
5??to_number('d0','xx'),
6??to_number('00','xx'),
7??to_number('a4','xx')
8??from dual;
TO_NUMBER('00','XX') TO_NUMBER('41','XX') TO_NUMBER('62','XX') TO_NUMBER('D0','XX') TO_NUMBER('00','XX') TO_NUMBER('A5','XX')
-------------------- -------------------- -------------------- -------------------- -------------------- --------------------
0? ?? ?? ?? ?? ?? ? 65? ?? ?? ?? ?? ?? ? 98? ?? ?? ?? ?? ?? ?208? ?? ?? ?? ?? ?? ???0? ?? ?? ?? ?? ?? ?164
結(jié)果的最后的一列為165,看起來應(yīng)該對(duì)應(yīng)上面查到的第二行,因?yàn)閚um=164
ROWID? ?? ?? ?? ?? ?OBJECT_ID? ? FILE_ID? ?BLOCK_ID? ?? ???NUM GOODID
------------------ ---------- ---------- ---------- ---------- --------------------
AAASUHAABAAAWLQACk? ?? ?75015? ?? ?? ? 1? ?? ?90832? ?? ???164 ORACLE_O
看起來好像巧合,再根據(jù)葉子節(jié)點(diǎn)轉(zhuǎn)儲(chǔ)的內(nèi)容,再查詢下一個(gè)索引記錄鎖對(duì)應(yīng)的rowid:00 41 62 d0 00 a5
SQL> select
2??to_number('00','xx'),
3??to_number('41','xx'),
4??to_number('62','xx'),
5??to_number('d0','xx'),
6??to_number('00','xx'),
7??to_number('a5','xx')
8??from dual;
TO_NUMBER('00','XX') TO_NUMBER('41','XX') TO_NUMBER('62','XX') TO_NUMBER('D0','XX') TO_NUMBER('00','XX') TO_NUMBER('A5','XX')
-------------------- -------------------- -------------------- -------------------- -------------------- --------------------
0? ?? ?? ?? ?? ?? ? 65? ?? ?? ?? ?? ?? ? 98? ?? ?? ?? ?? ?? ?208? ?? ?? ?? ?? ?? ???0? ?? ?? ?? ?? ?? ?165
這個(gè)對(duì)應(yīng)上面查詢內(nèi)容的第二行。因?yàn)閚um=165
ROWID? ?? ?? ?? ?? ?OBJECT_ID? ? FILE_ID? ?BLOCK_ID? ?? ???NUM GOODID
------------------ ---------- ---------- ---------- ---------- --------------------
AAASUHAABAAAWLQACl? ?? ?75015? ?? ?? ? 1? ?? ?90832? ?? ???165 ORACLE_O
結(jié)論:是否可以用索引鍵值對(duì)應(yīng)的rowid的第六個(gè)十六進(jìn)制數(shù)的十進(jìn)制格式,來判斷對(duì)應(yīng)數(shù)據(jù)塊的哪一行?
總結(jié)
以上是生活随笔為你收集整理的oracle z中rowid,如何将索引块里面的rowid和表里面的rowid对应起来?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle删除无效归档日志,求助:rm
- 下一篇: centos7 vnc oracle,C