ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle rowid的进化

Oracle rowid的进化

原创 Linux操作系统 作者:qiaoruzhi78 时间:2008-03-14 10:13:48 0 删除 编辑

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

上一篇: 10G ASM 学习笔记2
请登录后发表评论 登录
全部评论

注册时间:2008-01-23

  • 博文量
    31
  • 访问量
    69918