ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle ROWID概述

Oracle ROWID概述

原创 Linux操作系统 作者:keeptrying 时间:2012-05-16 12:40:11 0 删除 编辑

一、ROWID概念

A globally unique address for a row in a database.

ROWID 是一个类似于rownum的伪列,用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。而对于聚簇表,由于聚簇特性,不同表上的记录由于存储在相同的簇上,因此会拥有相同的ROWID。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。

二、分类

rowid 分为extended rowid restricted rowied.

1restricted rowied

Internally, the ROWID is a structure that holds information that the database server needs to access a row. The restricted internal ROWID is 6 bytes on most platforms.

Each restricted rowid includes the following data:

    1Datafile identifier

    2Block identifier

    3Row identifier

2extended rowid

The extended ROWID datatype includes the data in the restricted rowid plus a data object number. The data object number is an identification number assigned to every database segment. The extended internal ROWID is 10 bytes on most platforms.

Data in an extended ROWID pseudocolumn is returned to the client application in the form. of an 18-character string (for example, "AAAA8mAALAAAAQkAAA"), which represents a base 64 encoding of the components of the extended ROWID in a four-piece format, OOOOOOFFFBBBBBBRRR. Extended rowids are not available directly. You can use a supplied package, DBMS_ROWID, to interpret extended rowid contents. The package functions extract and provide information that would be available directly from a restricted rowid as well as information specific to extended rowids.

三、rowid的格式

Oracle Database uses a rowid to uniquely identify a row. Internally, the rowid is a structure that holds information that the database needs to access a row. A rowid is not physically stored in the database, but is inferred from the file and block on which the data is stored.

Oracle8以前,使用受限的ROWIDOracle8以后,使用扩展的ROWID。这里主要研究扩展的ROWID

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 /.

    扩展的ROWID 使用以64 为基数的编码方案来显示,该方案将六个位置用于数据对象编号、三个位置用于相关文件编号、六个位置用于块编号、三个位置用于行编号。

    64 为基数的编码方案使用字符“A-Z”、“a-z”、“0-9 和“/”。共有64 个字符

 

 

                                           ROWID64个编码及其代表的顺序

Base64表示

数字顺序

A-Z

0-25

a-z

26-51

0-9

52-61

+

62

/

63

 

扩展的ROWID 在磁盘上需要10 个字节的存储空间,并使用18 个字符来显示。

它包含下列组成元素:

    1. 数据对象编号:每个数据对象(如表或索引)在创建时都分配有此编号,并且此编号在数据库中是唯一的

    2. 相关文件编号:此编号对于表空间中的每个数据文件是唯一的

    3. 块编号:表示包含此行的块在数据文件中的位置

    4. 行编号:标识块头中行目录位置的位置

在内部,存储的10个字节(bytes),即80(bit)又按如下规则进行划分:

    1)数据对象编号需要32 bit

    2)相关文件编号需要10 bit

    3)块编号需要22 bit

    4)行编号需要16 bit

 

An extended rowid is displayed in a four-piece format, OOOOOOFFFBBBBBBRRR, with the format divided into the following components:

(1)       OOOOOO

The data object number identifies the segment (data object AAADJr). A data object number is assigned to every database segment. Schema objects in the same segment, such as a table cluster, have the same data object number.

(2)       FFF

The tablespace-relative data file number identifies the data file that contains the row (file AAE).

(3)       BBBBBB

The data block number identifies the block that contains the row (block AAAAAP). Block numbers are relative to their data file, not their tablespace. Thus, two rows with identical block numbers could reside in different data files of the same tablespace.

(4)       RRR

The row number identifies the row in the block (row AAA).

 

 

 

oracle 8以前,一个rowid占用6个字节大小的存储空间(10bit file#+22bit block#+16bit row#), rowid格式为:BBBBBBBB.RRRR.FFFF

    oracle 8以后, rowid的存储空间扩大到了10个字节(32bit object#+10bit rfile#+22bit block#+16bit row#),文件号仍然用10位表示,只是不再需要置换,为了向后兼容,同时引入了相对文件号(rfile#),所以从Oracle7Oracle8,Rowid仍然无需发生变化.

    增加的32bit object# 这个前缀主要就是用来定位表空间的,同时这个object#其实对应的就是data_object_id,由于一个段对象只能属于一个表空间,同时data_object_id就是标识了一个段的物理存储id.因此object#+rfile#就可以唯一定位当前的rowid是在那个数据文件上了。

    rowid这样改变之后,数据库中数据库文件个数的限制从整个数据库最多只能有的2^10-2=1022个数据文件(去掉全0和全1), 变为了每个表空间中可以最多2^10-2个数据文件。

    所以说,数据库能支持的数据文件最大数是受rowid的长度限制的。

 

    Rdba(Tablespace relative database block address)就是rowid中的rfile#+block#.

    需要注意的是: local index中存储的rowid6个字节,而global index中存储的rowid10个字节。

ROWID一旦确定,不可随意改变,但在下列条件下可以改变:

1if row movement is enabled, then the rowid can change because of partition key updates, Flashback Table operations, shrink table operations, and so on.

2If row movement is disabled, then a rowid can change if the row is exported and imported using Oracle Database utilities.

 

 

 

四、利用ROWID来得到相关信息

 

    rowid是伪列(pseudocolumn),伪劣的意思是实际上这一列本身在数据字典中并不存在,在查询结果输出时它被构造出来的。

    rowid并不会真正存在于表的data block,但是他会存在于index当中,用来通过rowid来寻找表中的行数据。

 

可以通过dbms_rowid这个包来转换我们的rowid成不同组成部分:

    dbms_rowid.rowid_object(rowid)---> 32bit object#
    dbms_rowid.rowid_relative_fno(rowid)---> 10bit rfile#
    dbms_rowid.rowid_block_number(rowid)---> 22bit block#
    dbms_rowid.rowid_row_number(rowid)---> 16bit row#


SYS@ tsid > select

  2  dbms_rowid.rowid_object(rowid) object#,

  3  dbms_rowid.rowid_relative_fno(rowid) rfile#,

  4  dbms_rowid.rowid_block_number(rowid) block#,

  5  dbms_rowid.rowid_row_number(rowid) row#,

  6  id,name

  7  from t

  8  where id=1;

 

   OBJECT#     RFILE#     BLOCK#       ROW#         ID NAME

---------- ---------- ---------- ---------- ---------- --------

     12907          4         15          0          1 a

 

 

直接查询ROWID

SYS@ tsid > select rowid from t where id=1;

 

ROWID

------------------

AAADJrAAEAAAAAPAAA

 

 

{AAADJr}                { AAE}              {AAAAAP}            { AAA}

Data Object Number   Relative File Number    Block Number        Row Number

 

 

可以使用dbms_rowidROWID转换:这里用到自定义函数get_rowid()

 

SYS@ tsid > select get_rowid('AAADJrAAEAAAAAPAAA') row_id from dual;

 

ROW_ID

--------------------------------------------------------------------

Object# is      :12907

Relative_fno is :4

Block number is :15

Row number is   :0

ROWID格式.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25744374/viewspace-729897/,如需转载,请注明出处,否则将追究法律责任。

下一篇: oracle db、dba和rdba
请登录后发表评论 登录
全部评论

注册时间:2011-04-25

  • 博文量
    130
  • 访问量
    940828