日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle z中rowid,如何将索引块里面的rowid和表里面的rowid对应起来?

發布時間:2025/3/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle z中rowid,如何将索引块里面的rowid和表里面的rowid对应起来? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題:

1、如何將索引塊里面的rowid和表里面的rowid對應起來?

驗證如下,請各位大俠指正

建表

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

轉儲索引塊

alter session set events 'immediate trace name treedump level 75096';

內容如下:

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)

轉儲葉子塊

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.

轉儲內容如下(省略顯示索引頭部):

...

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? ?? ?? ?--對應數據行的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

第一個葉子節點的第一個條目索引鍵值轉化為字符串

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

根據該索引鍵值查找記錄對應數據行記錄

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

從葉子節點轉儲的內容

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? ?? ?? ?--對應數據行的rowid

可以判斷,索引鍵值ORACLE_O,對應的rowid為,00 41 62 d0 00 a4。

把rowid轉為十進制

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

結果的最后的一列為165,看起來應該對應上面查到的第二行,因為num=164

ROWID? ?? ?? ?? ?? ?OBJECT_ID? ? FILE_ID? ?BLOCK_ID? ?? ???NUM GOODID

------------------ ---------- ---------- ---------- ---------- --------------------

AAASUHAABAAAWLQACk? ?? ?75015? ?? ?? ? 1? ?? ?90832? ?? ???164 ORACLE_O

看起來好像巧合,再根據葉子節點轉儲的內容,再查詢下一個索引記錄鎖對應的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

這個對應上面查詢內容的第二行。因為num=165

ROWID? ?? ?? ?? ?? ?OBJECT_ID? ? FILE_ID? ?BLOCK_ID? ?? ???NUM GOODID

------------------ ---------- ---------- ---------- ---------- --------------------

AAASUHAABAAAWLQACl? ?? ?75015? ?? ?? ? 1? ?? ?90832? ?? ???165 ORACLE_O

結論:是否可以用索引鍵值對應的rowid的第六個十六進制數的十進制格式,來判斷對應數據塊的哪一行?

總結

以上是生活随笔為你收集整理的oracle z中rowid,如何将索引块里面的rowid和表里面的rowid对应起来?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。