根据一个给定的rowid手工推算他的file#,block#,obj#,row#

联系:QQ(5163721)

标题:根据一个给定的rowid手工推算他的file#,block#,obj#,row#

作者:Lunar©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]

从Oracle 8i开始使用扩展rowid标识行物理地址,扩展rowid使用base64编码行的物理地址,编码字符包含A-Z, a-z, 0-9, +, 和/。
扩展rowid由四部分组成:OOOOOOOFFFBBBBBBRRR。其中:
OOOOOO:数据对象编号(6位显示)
FFF:相关数据文件编号(3位显示)
BBBBBB:数据块编号(6位显示)
RRR:数据块中行编号(3位显示)
8i以后,rowid采用base64编码(基于64位的编码)的扩展rowid.
.
关于64bit编码表,可以搜索Google或者Baidu,关键字“Base64编码表”。

无标题


将64位编码转换为十进制:
file#: AAB —–> 0 0 1 —–>0*64^2+0*64^1+1*64^0 =1
block#: AAAAMh —–> 0 0 0 0 12 33 —–>0*64^5+0*64^4+0*64^3+0*64^2+12*64^1+33*64^0 =801
obj#: AAAABi —–> 0 0 0 0 1 34 —–>0*64^5+0*64^4+0*64^3+0*64^2+1*64^1+34*64^0 =98
row#:AAf —–> 0 0 31 —–>0*64^2+0*64^4+0*64^1+31*64^0 =31
注意这里,row#是31行(我的环境是Oracle 11.2.0.3),记住row#是从0开始计数的,这个是固定位置(10g中是第25行)

验证一下:
SYS@lunarp>select rownum,substr(rowid,1,6) “object”,
2 substr(rowid,7,3) “file”,
3 substr(rowid,10,6) “block”,
4 substr(rowid,16,3) “row”
5 from props$
6 where name = ‘GLOBAL_DB_NAME’;

ROWNUM object file block row
———- ———————— ———— ———————— ————
1 AAAABi AAB AAAAMh AAf

Elapsed: 00:00:00.01
SYS@lunarp>select distinct dbms_rowid.rowid_relative_fno(rowid) file#,
2 dbms_rowid.rowid_block_number(rowid) blk#,
3 dbms_rowid.rowid_object(rowid) obj#,
4 dbms_rowid.rowid_row_number(rowid) row#
5 from props$
6 where name = ‘GLOBAL_DB_NAME’;

FILE# BLK# OBJ# ROW#
———- ———- ———- ———-
1 801 98 31

Elapsed: 00:00:00.02
SYS@lunarp>

data_block_dump,data header at 0x76fa205c
===============
tsiz: 0x1fa0
hsiz: 0x5a
pbl: 0x76fa205c
76543210
flag=——–
ntab=1
nrow=36
frre=-1
fsbo=0x5a
fseo=0x16b4
avsp=0x1798
tosp=0x179f

此条目发表在 FAQ 分类目录,贴了 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注