1) Oracle 7.3.4.5
rowid rownum dump
00000710.0000.0004 1 01 00 07 10 00
00000710.0001.0004 2
00000710.0002.0004 3
00000710.0003.0004 4
00000710 = 1808: block number
0000 = 0: row#
0004 = 4: file#
01 00 07 10 00 = 10bit (file id) + 22bit(block number) + 16bit(row number)
这个版本的数据库,rowid由6byte组成, 支持2^10 - 1 =1023个数据文件。
2) Oracle 8.1.7.4
rowid rownum dump
AAAOpCAABAAAE5CAAA 1
AAAOpCAABAAAE5CAAB 2
AAAOpCAABAAAE5CAAC 3
AAAOpCAABAAAE5CAAD 4
AAAOpC :data object number -- 20034
AAB : file number -- 1
AAAE5C : block number -- 59970
AAA: row# -- 0
以上数据的对应关系是通过调用DBMS_ROWID package实现的:
select rowid, rownum , dbms_rowid.rowid_block_number(rowid),
dbms_rowid.rowid_object(rowid) ,
dbms_rowid.rowid_relative_fno(rowid)
from ...
其真正的算法对我来说还是个秘密。不知道有没有人知道呢?
当使用普通索引时,还是使用6byte的rowid, 当在partition table中使用global index时,就会使用到10byte的rowid, 它的组成是
32bit (db object number) + 10bit( file id) + 22 bit ( block number) + 16bit(row number), 为什么global index会使用到10byte的rowid呢?这是因为Normal index 可以从rfile# 来算出file#, 而global index则不能,必须通过db object number算出它属于那个tablespace。
3)x$kccfe -- Oralce内部表,用于rfile#到file#的转换。
其中注意FENUM FEREF这二个字段的对应关系。
4)一个tablespace有2^10 - 1的datafile。
一个big tablespace有2^32 block 。 即为4G的block。
一个datafile有2^16block。512K block。
一个数据库有多少个tablespace呢?
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26684/viewspace-206266/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26684/viewspace-206266/