当一个用户往Oracle数据库的表中插入一行数据时,Oracle就会自动在这一行数据上加上一个ROWID.
在一个Oracle数据库中每一行数据都会有一个唯一的ROWID,Oracle系统就是利用ROWID来定位数据行的。
ROWID是Oracle数据库提供的一个内置的标量数据类型,ROWID列可以同一个表中的其他列一起查询。
rowid具有一些如下的特性:
*ROWID是数据库中每一行的唯一标识符
*ROWID并不显式的存储为一列的值。
*ROWID可以被用来定位行,虽然它并未直接的给出一行的物理地址。
*ROWID提供了访问一个表中一行数据的最快的机制。
通过引入逻辑ROWID,实现了在索引表中可以有多个索引。
ROWID有两种,分别是扩展ROWID和限制性ROWID,其中扩展ROWID的格式如下:
-------- --------- --------- ---------
oooooo FFF BBBBBB RRR
-------- --------- --------- ----------
数据对象号 相对文件号 块号 行号
一个扩展ROWID在磁盘上需要10个字节的存储空间,它是用18个字符来显示,扩展ROWID的组成如下:
(1)数据对象号:被赋予每一个对象,它在一个数据库中是唯一的。
(2)相对文件号:对同一个表空间中的每一个文件是唯一的。
(3)块号:为相对文件中包含数据行的块的位置
(4)行号:标识了块头中行目录的位置。
Oracle在内部扩展ROWID时,数据对象号需要32位,相对文件号需要10位,块号需要22位,而行号需要16位
,加起来总共为80位或10个字节。
扩展ROWID的显示是使用一种64位编码。其中:数据对象号为6位,相对文件号需要3位,块号需要6位,而行号需要3位,这种64位编码模式使用的字符为:A~Z,a~z,0~9还有+和/。总共64个字符。
如下:查询ROWID:
SQL> select ename,job,rowid from scott.emp;
ENAME JOB ROWID
---------- --------- ------------------
SMITH CLERK AAAMfMAAEAAAAAgAAA
ALLEN SALESMAN AAAMfMAAEAAAAAgAAB
WARD SALESMAN AAAMfMAAEAAAAAgAAC
JONES MANAGER AAAMfMAAEAAAAAgAAD
MARTIN SALESMAN AAAMfMAAEAAAAAgAAE
BLAKE MANAGER AAAMfMAAEAAAAAgAAF
CLARK MANAGER AAAMfMAAEAAAAAgAAG
SCOTT ANALYST AAAMfMAAEAAAAAgAAH
KING PRESIDENT AAAMfMAAEAAAAAgAAI
例如SMITH一列:
(1)数据对象号为AAAMfM
(2)相对文件号为AAE
(3)块号为AAAAAg
(4)行号为AAA
使用ROWID可以定位一个数据库中的任何数据行。因为一个段只能存放在一个表空间内。所以可以通过数据对象号Oracle服务器就可以找到包含数据行的表空间。之后使用表空间内的相对文件号就可以确定文件,再利用块号确定包含所需数据行的数据块,最后使用行号定位数据行的行目录项,使用行目录项可以定位数据行的起始地址。
限制性ROWID:
由块号,行号,文件号组成。
与扩展ROWID的最大区别就是:没有数据对象号。
整理自 何明《Oracle DBA基础培训教程》