oracle ROWID

ROWIDUROWID数据类型


Oracle database使用ROWID数据类型来存储database中的每一行


物理rowids存储的是在原始表(除了索引表),集群表,表分区和子分区,索引,和分区索引的地址。


逻辑rowid存储的是在索引表中的地址。



有一种单个数据类型称之为通用rowid,支持逻辑和物理的rowid,也包括从外部表中的rowid,通过一个gateway

UROWID数据类型可以存储所有的rowid,兼容的初始化参数必须设置在8.1以上,如果要使用UROWID字段。



伪列的ROWID


Oracle database中的每一张表都内部有一个伪字段叫做ROWID。这个伪字段在你通过SQLPLUS执行SQL命令的时候是看不到的,这个伪字段也不会消耗表里的空间。

但是,每一行的地址可以工作SQL查询查询到:


164526610.jpg


ROWID这个值你不能通过insertupdate来设置,你也不能删除一个ROWIDvalueOracle 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格式支持表空间relativedata block笛子,可以定义出分区表和索引中的row,也可以定义非分区表和索引中的row


限制型rowid支持oracle7或者之前版本,other way ,old grandpa ,always dead in the tomb




扩展性rowid

扩展性rowid为每行提供base 64encoding的物理地址。编码字符包括:A-Z,a-z,+,and /.

比如:

170938147.jpg


扩展型rowid包括四部分:000000 FFF BBBBBB RRR’


000000:定义database段的数字,在相同段的对象,有相同的data object number



FFF:三个字节:包含row的表空间对应的datafile号。


BBBBBB:包含这个rowdata block号。Block号码和它们的datafile相关,而不是tablespace

因此,两个有same block号码的row可能放在同一个表空间的不同的数据文件中。


RRRblock中的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函数来把


你可能感兴趣的:(oracle,rowid)