一、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