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;