全部博文(101)
分类: 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部分