ROWID

来源:互联网 发布:redcloud赤芸有淘宝吗 编辑:程序博客网 时间:2024/05/01 09:19

当一个用户往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基础培训教程》

原创粉丝点击