Oracle ROWID格式及rdba

Oracle 8i以上smallfile表空间的ROWID格式是:OOOOOO.FFF.BBBBBB.RRR,其中:

O--对象号

F--文件号

B--块号

R--行号

ROWID是一个64位数,共18位。

64位编码表如下:

64位码 对应十进制数值
A~Z 0~25
a~z 26~51
0~9 52~61
+ 62
/ 63

 

ROWID存储为10个字节,共80位,组成形式:32bit obj# +10bit rfile#+22bit block# +16bit row#

可以使用dbms_rowid包对ROWID进行解析:

select dbms_rowid.rowid_object('&&rowid') obj_id#, dbms_rowid.rowid_relative_fno('&&rowid') rfile#, dbms_rowid.rowid_block_number('&&rowid') block#, dbms_rowid.rowid_row_number('&&rowid') row# from dual;

 

从Oracle10g开始,Oracle引入了bigfile表空间,ROWID格式随之变为:OOOOOO.LLLLLLLLL.RRR,其中:

O--对象号

L--块号

R--行号

存储格式也调整为:32bit obj# + 32bit block# +16bit row#

 

RDBA是relative data block address, 即相对数据块地址。在DUMP数据库块时会经常看到RDBA,RDBA是一个16进制数,组成形式:10bit rfile#+22bit block#。

以下两种方法可以用来转换RDBA:

1. 使用dbms_utility包

select dbms_utility.data_block_address_file(to_number('&&rdba','xxxxxxxxxxxxx')) file_id, dbms_utility.data_block_address_block(to_number('&&rdba','xxxxxxxxxxxxx'))  block_id from dual;

2. 直接解析

select trunc(to_number('&&rdba','xxxxxxxxxxxxx')/power(2,22)) file_id, mod(to_number('&&rdba','xxxxxxxxxxxxx'),power(2,22)) block_id from dual;

posted @ 2012-02-06 11:02  生命的力量在于不顺从  阅读(757)  评论(0编辑  收藏  举报