ROWID唯一性
在oracle数据库中rowid是唯一的吗,或许很多人第一反应都是这么认为。这种说法其实并不准确,应该说在oracle 8以前,在整个数据库层面rowid是唯一的,而从oracle 8开始,在数据库层面rowid并不是全局唯一的,针对表空间来说,存储在其中的数据的rowid则是相对唯一的。
我们知道在数据库中存放的每一条记录都有一个ROWID ,代表着这条记录在数据库存放的物理地址。
从oracle 8开始ROWID的格式发生了变化,大小也从8字节增加到了10个字节。当你对某个表进行重组或者导出导入,则ROWID会变化。比如对于一个分区表来说,如果通过update语句将数据行从一个分区迁移到另一个分区,则其rowid会发生变化。
Oracle 7格式
在Oracle 7中ROWID由8个字节组成:
- 字节1到4 (bits 1 to 32): 数据块编号 (0-4294967295)
- 字节5到6 (bits 33 to 48): 数据块里的行编号 (0-65535)
- 字节7到8 (bits 49 to 64): 数据文件编号(0-65535)
每个字节由2个16进制的字符表示 (0-9A-F),同时每个部分由圆点隔开: BBBBBBBB.RRRR.FFFF
这个时候数据库里文件数最大为1022,当时使用已经足够,而随着业务的不断发展,所需要的文件数也越来越大,1022也明显不够用。到oracle 8时,想增加数据文件数量的同时又不想修改已有数据的rowid,因为这会牵涉到在升级过程中需要修改所有数据块的巨大工作量,所以对rowid的组成部分进行了变更。