ORACLE中的ROWID

王朝oracle·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

我们可能对oracle的rowid的使用并不陌生,不过,如果仔细分析一下,发现其还是有些知识点。

1、rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行。 2、rowid是存储在索引中的一组既定的值(当行确定后)。我们可以像表中普通的列一样将它选出来。

3、利用rowid是访问表中一行的最快方式。

4、rowid需要10个字节来存储,显示为18位的字符串。

rowid的组成结构为:

data object number(6位字符串)+relative file number(3位字符串)+block number(6位字符串)+row number(3位字符串),如:AAAADeAABAAAAZSAAA

5、我们可以借助oracle提供的包dbms_rowid,来对rowid进行解析从而获取关于行的相关信息:

bossdb-SQL>select

2 rowid,

3 dbms_rowid.rowid_object(rowid) obj_id,

4 dbms_rowid.rowid_relative_fno(rowid) df#,

5 dbms_rowid.rowid_block_number(rowid) blknum,

6 dbms_rowid.rowid_row_number(rowid) rowno

7 from p_test where rownum<5;

ROWID OBJ_ID DF# BLKNUM ROWNO

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

AAAQ+tAANAAAC6SAAA 69549 13 11922 0 AAAQ+tAANAAAC6SAAB 69549 13 11922 1 AAAQ+tAANAAAC6SAAC 69549 13 11922 2 AAAQ+tAANAAAC6SAAD 69549 13 11922 3

我们可以看到,通过rowid_row_number得到的行号是从0开始的,这是和rownum伪列的一个不同之处。我猜测rowid_row_number在求行号的时候是计算首行的偏移量。

一般来说,当表中的行确定后,rowid就不会发生变化。

但当如下情况发生时,rowid将发生改变:

1、对一个表做表空间的移动后

2、对一个表进行了EXP/IMP后

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有  導航