Chinaunix首页 | 论坛 | 博客
  • 博客访问: 509192
  • 博文数量: 101
  • 博客积分: 1635
  • 博客等级: 上尉
  • 技术积分: 1282
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-05 01:51
文章分类

全部博文(101)

文章存档

2019年(2)

2018年(16)

2013年(14)

2012年(69)

我的朋友

分类: Oracle

2013-02-19 17:17:42

Rowid 表示一个行的物理地址,一行一旦插入数据库的快中,Rowid就已经确定唯一,只要不发生行的物理移动
,这行的Rowid是不会发生任何变化的。Rowid不真正存在于表数据块中,但是会存在于索引中,方便根据索引的Rowid找到表

数据。Rowid只有在行的物理位置发生改变的情况下才变化,如表的Move,Flashback table,分区表的行区间移动等等。
而行迁移和行链接等块的内部变化,变化的仅仅是指针,而不会使行的Rowid变化。
现在rowid的机构为:ooooooFFFBBBBBBRRR占用10个字节。其中o是对象ID,F是文件ID,B是块ID,R是行ID。由于rowid组成从

file#变成了rfile#,所以数据文件的限制也从整个库不能超过1023变成了每个表空间不能超过1023个数据文件。
因为引入了oooooo代表data_object_id,而data_object_id对应特定的物理表空间,所以,oooooo+FFF就决定了每个表空间

只要数据文件不超过1023个即可。

查询一个表的Rowid,就可以获得object的信息,相对于文件编号信息,块信息与行信息等等。
SQL> select rowid from test where rownum=1;
 
ROWID
------------------
AAAyV9ABHAABD1nAAA

其中AAAyV9表示object_id
    ABH表示file id
    AABD1n表示block id
    AAA表示row id
rowid是由64进制组成

A-Z===0-25(26)
a-z===26-51(26)
0-9===52-61(10)
+/===62-63
其中 AAAyV9为例
61*(64^0)
21*(64^1)
50*(64^2)
object_id= 0+0+0+61+1344+204800=206153
通过dbms_rowid包等到
SQL> select dbms_rowid.rowid_object('AAAyV9ABHAABD1nAAA') data_object_id#,
  2  dbms_rowid.rowid_relative_fno('AAAyV9ABHAABD1nAAA') rfile#,
  3  dbms_rowid.rowid_block_number('AAAyV9ABHAABD1nAAA') block#,
  4  dbms_rowid.rowid_row_number('AAAyV9ABHAABD1nAAA') row# from dual;
 
DATA_OBJECT_ID#     RFILE#     BLOCK#       ROW#
--------------- ---------- ---------- ----------
         206205         71     277863          0

其中data_object_id#等于上面的计算的结果

块的地址rdba是rowid中的FFFBBBBBB部分

阅读(2585) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~