Oracle中的ROWID详解

大家都知道oracle中有两个比较便捷的隐藏column,分别为ROWID和ROWNUM。
SQL> select id,name,rowid,rownum from ran;
ID NAME ROWID ROWNUM
---------- ---------- ------------------ ----------
1 a AAAMluAABAAAOyyAAA 1
2 b AAAMluAABAAAOyyAAB 2
其中ROWNUM就不说了,就是该数据行在表中的列,在这里就不再赘述。
而ROWID其实是一组64进制数,可以这样拆开理解。
比如AAAMluAABAAAOyyAAA,拆分为AAAMlu AAB AAAOyy AAA,即以6 3 6 3的格式拆分。
在这里说下64进制与10进制的转换
A-Z <==> 0 - 25 (26)
a-z <==> 26 - 51 (26)
0-9 <==> 52 - 61 (10)
+/ <==> 62 - 63 (2)
所以AAAMlu可以转换为51566。
SQL> select 0+0+0+12*power(64,2)+37*64+46 from dual;
0+0+0+12*POWER(64,2)+37*64+46
-----------------------------
51566
这个数值为ran表在DBA_OBJECTS表中的唯一标识OBJECT_ID。
SQL> select object_id from user_objects where object_name='RAN'; OBJECT_ID
----------
51566
而AAB就很简单了,直接转换为1,代表的是该行在数据库中存放的物理数据文件编号
SQL> select file_name 文件名,file_id,tablespace_name 表空间 from dba_data_files;
文件名 FILE_ID 表空间
D:ORACLEPRODUCT10.2.0ORADATAORCLUSERS01.DBF 4 USERS D:ORACLEPRODUCT10.2.0ORADATAORCLSYSAUX01.DBF 3 SYSAUX D:ORACLEPRODUCT10.2.0ORADATAORCLUNDOTBS01.DBF 2 UNDOTBS1
D:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.DBF 1 SYSTEM
D:ORACLEPRODUCT10.2.0ORADATAORCLLEARN.ORA 5 LEARN
即表示ran表存放在D:ORACLEPRODUCT10.2.ORADATAORCLSYSTEM01.DBF这个文件中,所属表空间为system。
AAAOyy表是该行数据在上述数据文件中的block位置,转换为60594
SQL> select 0+0+0+12*power(64,2)+37*64+46 from dual;
0+0+0+14*POWER(64,2)+50*64+50
----------
60594
这个位置的数据一会再验证
最后三位AAA表示该行数据在上述block中所在的行数,为第0行。
现在我们来验证下该行数据是否在datafile 1 block 60594中,我们把data dump出来。
SQL> alter system dump datafile 1 block 60594;
系统已更改。
之后我们去oracle_homedb_1adminSIDudump中查找修改时间最新的TRC文件,用笔记本打开它。
在这个文件的最下方看到如下文件
block_row_dump:
tab 0, row 0, @0x1f98
tl: 8 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [ 1] 61
tab 0, row 1, @0x1f90
tl: 8 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 03
col 1: [ 1] 62
end_of_block_dump
End dump data blocks tsn: 0 file#: 1 minblk 60594 maxblk 60594
其中的col 0: [ 2] c1 02 col 1: [ 1] 61就是ROWID为AAAMluAABAAAOyyAAA的数据了。
解读为:第0行 第一列 2字符 数值为 1,第二列 1字符 数值为a
其中的c1 02和61分别为数字1和英文小写字母a的ASCII码的64位存储形式。
例如
SQL> select ascii('a') from dual;
ASCII('A')
----------
97
SQL> select to_char(97,'xx') from dual;
TO_
---
61
所以我们可以看到只要知道了一行数据的ROWID就可以查找到该行数据在数据库中的哪个表,存放在哪个表空间,哪个物理文件,哪个数据块的中第几行,可以说ROWID是一行数据在Oracle中的唯一标识
[@more@]

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

转载于:http://blog.itpub.net/26680829/viewspace-1057297/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值