Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1657669
  • 博文数量: 292
  • 博客积分: 10791
  • 博客等级: 上将
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-20 21:06
文章分类

全部博文(292)

文章存档

2011年(31)

2010年(261)

分类: Oracle

2010-04-20 10:52:29

以下ROWID组成(也 叫受限Rowid)为:FFFF.BBBBBBBB.RRRR,占用6个字节(10bit file#+22bit+16bit),但是,为了扩充的需要,如数据文件的扩充,现在的Rowid改为:OOOOOOFFFBBBBBBRRR,占用 10个字节(32bit+10bit rfile#+22bit+16bit)。其中,O是对象ID,F是文件ID,B是块ID,R是行ID。由于rowid的组成从file#变成了 rfile#,所以数据文件数的限制也从整个库不能超过1023个变成了每个表空间不能超过1023个数据文件。
注意:这里的O,代表的是 data_object_id,是与段物理存储位置相关的一个信息,所以data_object_id + rfile#就能最终定位到该rowid在那个确定的物理数据文件。
如果我们查询一个表的ROWID,就可以获得object的信息,文件信息, 块信息与行信息等等,如根据其中块的信息,可以知道该表确切占用了多少个块,每行在哪个块上,哪个数据文件上。
用例子说明一下Rowid的组成:
SQL> select rowid from emp where rownum = 1;
AAAAeNAADAAAAWZAAA
分解一 下,可以看到
Data Object number = AAAAeN
File = AAD
Block = AAAAWZ
ROW = AAA

另外,我们需要注意的是,ROWID是64进制的,分布关系如下
A-Z <==> 0 - 25 (26)
a-z <==> 26 - 51 (26)
0-9 <==> 52 - 61 (10)
+/ <==> 62 - 63 (2)
拿其中的Data Object number= AAAAeN为例子,
N是64进制 中的13,位置为0
13 * (64 ^ 0) = 13
E是64进制中的30,位置为1
30 * (64 ^ 1) = 1920
A是64进制中的 0
所以 A * (64 ^ 2) = 0
A * (64 ^ 3) = 0
A * (64 ^ 4) = 0
A * (64 ^ 5) = 0
则有AAAAeN = 0 + 0 + 0 + 0 + 1920 + 13 = 1933,表示该行存在的对象,对应的对象号为1933。
而且,我们也可以利用oracle提供的包,dbms_rowid来做到这一 点:
代码:


select dbms_rowid
.rowid_object('AAAAeNAADAAAAWZAAA') data_object_id#,

       
dbms_rowid.rowid_relative_fno('AAAAeNAADAAAAWZAAA') rfile#,

       
dbms_rowid.rowid_block_number('AAAAeNAADAAAAWZAAA') block#,

       
dbms_rowid.rowid_row_number('AAAAeNAADAAAAWZAAA') row# from dual;



DATA_OBJECT_ID#     RFILE#     BLOCK#       ROW#

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

           
1933          3       1433          0

.


关 于更多dbms_rowid的用法,可以参考包的说明或者是oracle手册。
阅读(1044) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~