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