BruceLau
Relative_fno is :3
Block number is :25300
Row number is :0
Object# is :5944 MabelTang
Relative_fno is :3
Block number is :25300
Row number is :1
ROWID:
ROWID为该表行的唯一标识,是一个伪列,可以用在SELECT中,但不可以用INSERT, UPDATE来修改该值。
注意:ROWID的表指,普通表,cluster table, partition table, subpartition table, index, index partitions and subpartitions(注意:不包含index-organized tables).
每个表Oracle都存在一个伪列ROWID,这个伪列可以用SELECT查看,但是不可以用INSERT, UPDATE来修改。你也不可以用DELETE来删除
ROWID列,Oracle使用ROWID列来建立内部索引。你可以引用ROWID的值,但ROWID并不存放在数据库中,你可以创建一个表包含ROWID数据类型,
但Oracle不保证该值是合法的rowids。用户必须确保该rowid值是真实合法的。
UROWID:
UROWID(可以称为通用ROWID,逻辑ROWID): 表的行地址,表指的是index-organized tables。IOT中物理rowid是可能变化的,另外Oracle要依靠rowid来建立表的索引,所以对IOT表来物理rowid就不行了。Oracle以表的主键为基础引入UROWID,在物理rowid基础上建立了第二个索引。每一个逻辑rowid使用一个第二索引和一个物理推测(IOT中标识块的行)。
UROWID支持逻辑和物理的rowids,列UROWID类型可以存储各种rowids, 从8.1以后的Oracle才有UROWID类型,它也可以用来保存以前的ROWID类型数据信息。
更新IOT的主键可能导致ROWID改变,该行的UROWID也会改变。
Oracle使用rowid数据类型存储行地址,rowid可以分成两种,分别适于不同的对像
Physical rowids:存储ordinary table,clustered table,table partition and subpartition,indexe,index partition and subpartition
Logical rowids :存储IOT的行地址
另一种rowid类型叫universal rowed(UROWID),支持上述physical rowid和logical rowed,并且支持非oracle table,即支持所有类型的rowid,但COMPATIBLE必须在8.1或以上.
1.1 ROWID伪列
每个表在oracle内部都有一个ROWID伪列,它在所有sql中无法显示,不占存储空间;它用于从表中查询行的地址或者在where中进行参照,一个例子如下:
SELECT ROWID, last_name FROM employees;
Oracle内部使用保留在ROWID伪列中的值构建索引结构
再次强调一次,rowid伪列不存储在数据库中,它不是数据库数据,这是从database及table的逻辑结构来说的,事实上,在物理结构上,每行由一个或多个row pieces组成,每个row piece的头部包含了这个piece的address,即rowid.从这个意义上来说,rowid还是占了磁盘空间的.
我们在创建表时,可以为列指定为rowid数据类型,但oracle并不保证列中的数据是合法的rowid值,必须由应用程序来保证,另外,类型为rowid的列需要6 bytes存储数据
1.2, physical rowids
只在行存在,它的物理地址rowid就不会变化,除非export/import,根据rowid可以直接定位到block去fetch数据,所以physical兼具有高稳定(stability)和高性能(performance)的特点.
这里要注意一点,对于clustered table来说,根据它的存储特点,在同一个block中的不同table的行可能具有同一个rowid;而nonclustered table,每一行或初始行片(initial row piece)都有唯一的rowid
要注意rowid的地址固定的特点,在一个block的某一行被delete并commit后,它占据的address可以被其它事务新insert的行重用.
Physical rowid可以是下面任一一种格式:
1) Extended rowid
使用表空间相关的数据块地址,8i及以上使用这种格式
2) Restricted rowid
使用数据库范围的数据址地址,oracle 7或更早前的版本使用
1.2.1extened rowid
扩展行地址是64编码的物理地址,编码字符是A-Z, a-z, 0-9, +,and/.
由4部分组成OOOOOOFFFBBBBBBRRR (obj#file#block#row#)
OOOOOO -–data object number
FFF –-表空间相对的数据文件号
BBBBBB –-块号
RRR ---行号
注意不是16进制表示
SQL> select rowid,name from obj$ where rownum<=10;
ROWID NAME
------------------ ------------------------------
AAAAASAABAAAAB6ABc ACCESS$
AAAAASAABAAAC1QAAK AGGXMLIMP
AAAAASAABAAAC1QAAL AGGXQIMP
AAAAASAABAAAGiRAAI ALERT_QT
AAAAASAABAAAGiRAAh ALERT_QUE
AAAAASAABAAAGujAAo ALERT_QUE$1
AAAAASAABAAAGujAAp ALERT_QUE$1
AAAAASAA