oracle数据表的rowid,Oracle数据库开发——了解rowid

关于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博客 ” ,链接:http://blog.itpub.net/28929558/viewspace-1150766/,如需转载,请注明出处,否则将追究法律责任。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值