ROWID和UROWID数据类型
Oracle database使用ROWID数据类型来存储database中的每一行
物理rowids存储的是在原始表(除了索引表),集群表,表分区和子分区,索引,和分区索引的地址。
逻辑rowid存储的是在索引表中的地址。
有一种单个数据类型称之为通用rowid,支持逻辑和物理的rowid,也包括从外部表中的rowid,通过一个gateway。
UROWID数据类型可以存储所有的rowid,兼容的初始化参数必须设置在8.1以上,如果要使用UROWID字段。
伪列的ROWID
Oracle database中的每一张表都内部有一个伪字段叫做ROWID。这个伪字段在你通过SQLPLUS执行SQL命令的时候是看不到的,这个伪字段也不会消耗表里的空间。
但是,每一行的地址可以工作SQL查询查询到:
ROWID这个值你不能通过insert和update来设置,你也不能删除一个ROWID的value。Oracle database通过ROWID在伪列中来为了索引的创建。
你可以通过select ,where来查询rowid的值,但是rowid的值没有存储在database中,但是你可以创建一个包含ROWID数据类型的表,oracle虽然不保证这些字段是正确的rowid,需要用户来确认rowid字段的rowid是不是有效的rowid。
物理的rowid
物理的rowid提供了一个到达一张表的一行的最快的路径。包括一行的物理位置(确认到明确的block),允许你在单个block领中查询。
在非集群表中的每一行都被分配到了一个唯一的rowid,指向一行的物理地址的row piece(或者是initial row piece如果这一行和多个row pieces在一块)。集群表中,多个表中的rows在同一个data block,会有相同的rowid。
一个rowid分配给rowpiece之后,rowid在特殊情况下可能会改变。比如说:row迁移发生了,rowid就会改变,因为分区key升级了。闪回表的操作,shrink表的操作。如果row不能迁移,rowid可能改变,如果row通过oracle工具进行导入导出。
物理的rowid数据类型有两种格式:
扩展性rowid格式支持表空间relative的data block笛子,可以定义出分区表和索引中的row,也可以定义非分区表和索引中的row。
限制型rowid支持oracle7或者之前版本,other way ,old grandpa ,always dead in the tomb
扩展性rowid
扩展性rowid为每行提供base 64的encoding的物理地址。编码字符包括:A-Z,a-z,+,and /.
比如:
扩展型rowid包括四部分:000000 FFF BBBBBB RRR’
000000:定义database段的数字,在相同段的对象,有相同的data object number
FFF:三个字节:包含row的表空间对应的datafile号。
BBBBBB:包含这个row的data block号。Block号码和它们的datafile相关,而不是tablespace。
因此,两个有same block号码的row可能放在同一个表空间的不同的数据文件中。
RRR:block中的row。
你可以通过数据字典中的user_objects,dba_objects,all_objects 查询到data object number。
比如:下面的查询返回scott用户下的employee表的data object number
我理解的这个data_object_id:既然它对应的是oracle逻辑的segment,也就是table或者index单独的对应的segment,也就是说,这个data_objcet_id是用户下的表,索引所对应的在oracle database存储的具体位置号。
ROWID的使用
你可以使用SUBSTR函数来把