ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle rowid

oracle rowid

原创 Linux操作系统 作者:wisdomone1 时间:2013-03-22 17:16:35 0 删除 编辑

网贴: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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
提供针对oracle初学者及进阶的数据库培训,欢迎大家咨询: 微信: wisdomone 微信公众号: lovedb 工作经历: 中国普天 北京科蓝 北京云和恩墨 北京神州新桥

注册时间:2008-04-04

  • 博文量
    2189
  • 访问量
    12690169