数据存放在数据文件中,因为其存储,数据的一系列属性就随之确定,这些属性包括记录存储所在的数据文件(file#)、所属的数据库对象(obj#)、所在的数据块号(block_no#)以及在表中的行号等,将这些属性合并起来就构成了Oracle的ROWID。
Oracle的ROWID又可以分为两种:物理ROWID和逻辑ROWID。索引组织表使用逻辑ROWID,其他类型的表使用物理ROWID。
ROWID在表中并不存在,但是查询表时可以使用这一伪列
select rowid,t.* from scott.dept t;
因为ROWID可以唯一地标识一条记录,所以索引(Index)中存储了ROWID值,通过索引访问记录实际上也就是通过从索引中获得ROWID,再根据ROWID到数据表中定位记录的过程。
MOVE表之后索引需要重建就是因为存储位置发生了改变,索引中的ROWID无法定位到新的数据存储,所以需要重建。而Shrink过程因为使用的是DML操作,所以索引可以同时被维护,完成操作之后不再需要重建索引。
Oracle的ROWID在不同的版本中一直在不断变化:
★ 在Oracle 6中,ROWID中仅用6 bit代表文件号,所以数据库最多只能有2^6=64个数据文件(去掉全0和全1,实际上最多只能代表62个文件);
★ 到Oracle 8,ROWID组成扩展为FFFF.BBBBBBBB.RRRR,占用6个字节(其中10 bit file# + 22bit block# + 16bit row#);
★ 在Oracle 8i中,Oracle更是在ROWID中引入了dataobj#,现在的ROWID格式变更为OOOOOO.FFF.BBBBBB.RRR,占用10个字节。新的ROWID采用Base64编码,一共有18位,代表80位二进制数,其中O是对象号,F是文件号,B是块号,R是行号,这80位的方式为32bit obj# +10bit rfile#+22bit block#
+16bit row#。
ROWID的64个编码及代表的数字顺序如表5-3所示。
|
Base64表示 |
数字顺序 |
|
A~Z(A through Z) |
0~25 |
|
a~z(a through z) |
26~51 |
|
0~9(0 through 9) |
52~61 |
|
+ |
62 |
|
/ |
63 |
了解了ROWID的构成之后,就可以很清楚地理解Oracle数据库的一些内部限制,例如:
★ 每表空间最大文件数量=2^10=1024,去掉全0和全1,通常为1022个;
★ 每数据文件最大数据块数量=2^22=4M Block,通常每个文件最大Block数量为4M个Oracle块;




