ITPub博客

首页 > 数据库 > Oracle > Oracle数据库开发——了解rowid

Oracle数据库开发——了解rowid

原创 Oracle 作者:呆呆笨笨的鱼 时间:2014-04-28 12:00:38 0 删除 编辑
关于rowid,这个伪列具体有什么作用呢?

rowid是一个64进制数,一共18位,
其中前6表示数据段的编号,接下来的3位表示相对文件编号,再下来的6位是块编号,最后3位是相对块的行编号。

即:
OOOOOO(Data Object Number) FFF(relative file number相对表空间的文件编号) BBBBBB(Block Number) RRR(Row number)

注意:相对文件编号和绝对文件编号的区别
SQL> select t.FILE_ID,t.RELATIVE_FNO from dba_data_files t; 
 
   FILE_ID RELATIVE_FNO
---------- ------------
         1            1
         2            2
         3            3
         4            4
         5            5
         6            6
         7            7
         8            8
 
其中 FILE_ID 绝对文件编号,RELATIVE_FNO 相对文件编号
当数据库里面的数据文件小于等于1022的时候,绝对文件编号 和 相对文件编号相等。


这64进制是怎么样来表示的:
A~Z 表示 0到25
a~z 表示 26到51
0~9 表示 52到61
+  表示 62
/  表示 63

这样0~63就全了~

来验证下:
SQL> select rowid,g.* from goods g;
 
ROWID                                                 G_ID G_NAME          G_PRICE G_LEVELS
------------------ --------------------------------------- ---------- ------------ ----------
AAADtcAAEAAAACnAAA                                       1 LoL               88.00 低价


可以看到该条数据:
AAADtc(数据段编号)AAE(相对文件编号) AAAACn(块编号)  AAA(块中行号)


SQL> select OWNER,OBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID from dba_objects where owner = 'ZHANGBIN' and object_name ='GOODS';
 
OWNER                          OBJECT_NAME            OBJECT_ID DATA_OBJECT_ID
------------------------------ --------------------- ---------- --------------
ZHANGBIN                       GOODS                      15196          15196


可以看到表goods表的数据段编号为 15196


计算一下: AAADtc =? 15196

SQL> select 0*power(64,5)+0*power(64,4)+0*power(64,3)+3*power(64,2)+45*64+28 from dual;
 
0*POWER(64,5)+0*POWER(64,4)+0*
------------------------------
                         15196

结果是相等的


同理可以计算出
 
AAE(相对文件编号)=4   
AAAACn(块编号)= 2*64 + 39 = 167  
AAA(块中行号)= 0

那么,这说明goods表中的这行数据,应该在4号文件的第167个块上?验证一下。

SQL> select * from dba_extents where owner = 'ZHANGBIN' and segment_name = 'GOODS';

OWNER     SEGMENT_NAME  PARTITION_NAME  SEGMENT_TYPE TABLESPACE_NAME  EXTENT_ID    FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO
--------- ------------- --------------- ------------ --------------- ---------- ---------- ---------- ---------- ---------- ------------
ZHANGBIN  GOODS                         TABLE        USERS                    0          4        160      65536          8            4


可以看到 FILE_ID = 4,BLOCK_ID = 160,BLOCKS = 8
说明 4号文件,从第160块开始,连续8个块属于表GOODS的数据段,即块号位160 ~ 167属于GOODS的数据段


我们计算出来的块是167,即验证了goods表中这行数据,应该在4号文件的第167个块上
又由于AAA(块中行号)= 0,该条数据存在 4号文件的第167个块上的第一行 !


以上是我们自己手工来装换计算
=====================================================================
Oracle中提供了计算rowid相关值的包 dbms_rowid


SQL> select
  2         dbms_rowid.rowid_object('AAADtcAAEAAAACnAAA') as data_object_id
  3        ,dbms_rowid.rowid_relative_fno('AAADtcAAEAAAACnAAA') as relative_fno
  4        ,dbms_rowid.rowid_block_number('AAADtcAAEAAAACnAAA') as block_number
  5        ,dbms_rowid.rowid_row_number('AAADtcAAEAAAACnAAA') as row_number
  6  from dual;
 
DATA_OBJECT_ID RELATIVE_FNO BLOCK_NUMBER ROW_NUMBER
-------------- ------------ ------------ ----------
         15196            4          167          0

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28929558/viewspace-1150766/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-04-17

  • 博文量
    62
  • 访问量
    939483