首页 > Linux操作系统 > Linux操作系统 > oracle rowid
网贴:http://blog.csdn.net/tianlesoftware/article/details/5020718
/**********用dbms_rowid包获取表的rowid相关信息或者dbms_rowid.rowid_info*******************/
SQL> select a,
2 dbms_rowid.rowid_object(rowid) as object_id,
3 dbms_rowid.rowid_relative_fno(rowid) as file_id,
4 dbms_rowid.rowid_block_number(rowid) as block_id,
5 dbms_rowid.rowid_row_number(rowid) as row_number
6 from t_undo
7 /
A OBJECT_ID FILE_ID BLOCK_ID ROW_NUMBER
--------------------------------------- ---------- ---------- ---------- ----------
1 70019 1 73289 0
/*********rowid内部存储占用10个字节长度,展示给我们为18个字符*****************/
SQL> select a,rowid,length(rowid),dump(rowid,16) from t_undo;
A ROWID LENGTH(ROWID) DUMP(ROWID,16)
--------------------------------------- ------------------ ------------- --------------------------------------------------------------------------------
1 AAARGDAABAAAR5JAAA 18 Typ=69 Len=10: 0,1,11,83,0,41,1e,49,0,0
/*********************************rowid格式************************/
ROWID AAARGDAABAAAR5JAAA
1,分成4个小部分
2,第1部分:000000,占用6个字符;表示数据对象的编号
第2部分:fff,占用3个字符,表示相关文件编号(即表空间内部)
第3部分:bbbbbb,占用6个字符,表示块编号
第4部分:rrr,占用3个字符,表示行编号
在内部,rowid存储的10个字节(bytes),即80位(bit)又按如下规则进行划分:
(1)数据对象编号需要32 bit
(2)相关文件编号需要10 bit
(3)块编号需要22 bit
(4)行编号需要16 bit
在oracle 8以前,一个rowid占用6个字节大小的存储空间(10bit file#+22bit block#+16bit row#), 没有data object id
rowid格式为:BBBBBBBB.RRRR.FFFF。
在oracle 8以后, rowid的存储空间扩大到了10个字节(32bit object#+10bit rfile#+22bit block#+16bit row#),
文件号仍然用10位表示,只是不再需要置换,为了向后兼容,同时引入了相对文件号(rfile#),所以从Oracle7到Oracle8,Rowid仍然无需发生变化.
rdba即rowid中的rfile#+block#(是表空间中的数据文件相对文件号和数据块号)
Rdba(Tablespace relative database block address)就是rowid中的rfile#+block#.
/***************相关文件编号需要10 bit***************************/
rowid这样改变之后,数据库中数据库文件个数的限制从整个数据库最多只能有的2^10-2=1022个数据文件(去掉全0和全1), 变为了每个表空间中可以最多有2^10-2个数据文件。
所以说,数据库能支持的数据文件最大数是受rowid的长度限制的。
(需要注意的是: local index中存储的rowid是6个字节,而global index中存储的rowid是10个字节。)
SQL> select object_name,object_id,data_object_id from dba_objects where object_name='T_UNDO' and wner='SYS';
OBJECT_NAME OBJECT_ID DATA_OBJECT_ID
-------------------------------------------------------------------------------- ---------- --------------
T_UNDO 70019 70019
这样的话,rowid最前面的32bit的object#即定位表空间的,因为前面用的是相对文件号;而这个相对文件号是在一个表空间里面界定的;
同时data_object_id就是标识了一个段的物理存储id.
这样的话:object#(唯一确定一个表空间)+rfile#(相对文件号)就可以定位到具体的数据文件了
因此object#+rfile#就可以唯一定位当前的rowid是在那个数据文件上了。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9240380/viewspace-756881/ ,如需转载,请注明出处,否则将追究法律责任。