ROWID

 一、ROWID的分类

physical rowid:表示存储在堆表、聚集表、表分区、索引分区中的行地址;

logical rowid:表示存储在index-organized table的行地址;

foreign rowid:作为外部表的标识,不具有标准的ORACLE ROWID格式。

注意:UROWID或叫universal rowid支持所有种类的rowid。

二:ROWID的用途

摘自ORACLE技术文档的说法,可以使用ROWID:

  • Rowids are the fastest means of accessing particular rows.
  • Rowids provide the ability to see how a table is organized.
  • Rowids are unique identifiers for rows in a given table.

另外,可以使用ROWID作为column的类型,不过,该类型下的列不能作为主键,因为当发生ROW MOVEMENT或这对数据进行导入导出的时候,可能会改变ROWID的值。该类型下的列操作跟普通列的操作一样。

还有,就是ROWID Pseudocolumn(ROWID伪列),其有点像没有参数的SQL函数。它不会存储在物理磁盘中,只可以查询,不能进行ISERT等DML语句,当时可以为每一行返回唯一的地址。

三:ROWID的格式


摘自ORACLE技术文档的说法:

An extended rowid includes a data object number. This rowid type uses a base 64 encoding of the physical address for each row. The encoding characters are A-Z , a-z , 0-9 , +, and /。

其组成部分为:

Data Object Number:段的标识;

Relative File Number:对应段下的数据文件标识,参照Data Object Number;

Data block number:对应Relative File Number下的数据块标识,参照Relative File Number;

Row Number:行在对应Data block number数据块中标识;

ROWID的改变:

若row movement被启动了,则对于分区键的更新、Flashback Table操作、shrink table操作等都会引发ROWID的改变;

若row movement没有被启动,则ORACLE的导入导出功能也会改变ROWID。

本质地来说,如果physical row被删除或重新插入,就会发生ROW movement。但是,row movement被看作是更新,会隐式触发触发器

四:关于logical rowid

对于logical rowid和foreign rowid,所采用的是UROWID的类型。

对于index-organized table,由于其行数据是保留在leaf block上的,而B-tree中只是允许每个块的2/3空间用来存储键值,所以当块的空间超过了2/3时,该块中的键值就被分割存储在两个块中。而且,数据的删除不一定会导致块的合并,因为块的合并会付出很大的代价,也就是留作后来数据的插入使用。为此,对于index-organized table来说physical rowid会经常发生变化。因此,ORACLE引入了logical rowid.

logical rowid是基于表的主键而建立的,只要主键值不变,则logical rowid不变。

五:关于rowid的计算

前面提到,rowid采用的是64位存储,对于extended rowid来说,也就是:

A-Z <==> 0 - 25 (26)
a-z <==> 26 - 51 (26)
0-9 <==> 52 - 61 (10)
+/ <==> 62 - 63 (2)

采用进制的换算方法就可以转换成十进制。比如说,relative file number为AAF,则转换成十进制,就是0*64^2+0*64^1+5*64^0=5,也就是relative file number为5.另外,使用dbms_rowid这个包可以实现这个的转换,即dbms_rowid.rowid_object,dbms_rowid.rowid_relative_fno,dbms_rowid.block_number,dbms_rowid.rowid_row_number.

参考信息:

oracle document:database_concept,

SQL language reference;

《海量数据库解决方案》;

http://www.2cto.com/database/201109/104961.html


---------------------------------------------------------------------------------------------------
如有错误,欢迎指正

技术交流QQ:1732035211
技术交流邮箱:1732035211@qq.com
新浪微博:数据库小菜鸟http://weibo.com/u/3132578390

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值