oracle sql 高级编程学习笔记(十一)

ROWID是ORACLE中的一个重要的概念。用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。ROWID它是一个伪列,它并不实际存在于表中。它是ORACLE在读取表中数据行时,根据每一行数据的物理地址信息编码而成的一个伪列。所以根据一行数据的ROWID能找到一行数据的物理地址信息。从而快速定位到数据行。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。

一、rowid格式

这里写图片描述
第一部分6位表示:该行数据所在的数据对象的 data_object_id;
第二部分3位表示:该行数据所在的相对数据文件的id;
第三部分6位表示:该数据行所在的数据块的编号;
第四部分3位表示:该行数据的行的编号;
索引就是保存了rowid后三个部分的信息。索引是物理存在的,而rowid是伪列。所以索引可以用来快速地定位到数据行。

1、data_object_id

data_object_id就是表示存放数据的“数据段对象的id”,也就是与存放表数据的物理位置有关:
注:object_id 与data_object_id 在建表的时候是一样,但是 object_id其实是对每个数据库中数据对象的唯一标识,
当对数据库对象进行move,truncate 操作后 data_object_id 会发生变化

 select object_name, object_id,data_object_id,status from USER_objects  ;

这里写图片描述

2、相对文件编码

关于相对文件编码和绝对文件编号:相对文件id是指相对于表空间,在表空间唯一,绝对文件是指相当于全局数据库而言的,全局唯一;
这里写图片描述

二、rowID 编码规则

rowid采用64进制来编码
编码方法是:A~Z表示0到25;a~z表示26到51;0~9表示52到61;+表示62;/表示63;刚好64个字;
这里写图片描述

三 、rowID的计算

1、获取rowid
——select t.rowid, t.* from emp t;mp 表 获取 rowid如下
这里写图片描述

2、获取data_object_id

这里写图片描述
1中查询第一个行数据的rowid 可知data_object_id 为 AAAR3s;

       字符     码值 
       A         0
       R        17
       3        55
       s        44

转换为10进制 17*64*64+55*64+44=73196 与上面的查询结果一致。

3、验证file_id

获取当前表的表空间名称
select T.tablespace_name,T.segment_name from user_segments t where t.segment_name=’EMP’ AND T.segment_type=’TABLE’;
这里写图片描述
获取 相对文件编码

这里写图片描述

根据1中表EMP 的rowid 是AAAR3sAAEAAAACXAAA,相对文件编号 为AAE=4;
与上面的查询结果一致。

4、验证块编号以及所有数据

验证块编号: 根据rowid AAAR3sAAEAAAACXAAA 可知块编号为AAAACX=2*64+23=151;与下面的查询结果一致。

通过Oracle提供的存储过程来获取块编号以及rowid的其他几个指标:
SELECT

dbms_rowid.rowid_object (ROWID) data_object_id,

dbms_rowid.rowid_relative_fno (ROWID) relative_fno,

dbms_rowid.rowid_block_number (ROWID) block_no,

dbms_rowid.rowid_row_number (ROWID) row_no

FROM

EMP ;

这里写图片描述

验证行编号 同样根据 rowid 是AAAR3sAAEAAAACXAAA,知道行编号为 AAA=0,即第一行。与上面的查询结果一致

参考文章:http://www.cnblogs.com/xqzt/p/4449184.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜的中年程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值