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

本文围绕ORACLE的ROWID展开,介绍其是用于定位数据库记录的相对唯一地址值,为伪列。阐述了rowid格式,包括data_object_id、相对文件编码等部分;说明了rowid编码规则为64进制;还详细演示了rowid的计算,如获取data_object_id、验证file_id等。

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

编辑推荐 《Oracle SQL高级编程》:资深Oracle专家力作,OakTable团队推荐,全面、独到、翔实,题材丰富,Oracle开发人员和DBA必备。 媒体推荐 本书作者全部是OakTable的成员,且具有15-29年丰富的Oracle开发经验。在研究一些被其他专门讨论Oracle SQL语言的参考书直接忽略的问题时,这种对Oracle数据库的长期钻研无疑是一个巨大的优势。   ——亚马逊读者评论 目录 第1章 SQL核心 1 1.1 SQL语言 1 1.2 数据库的接口 2 1.3 SQL*Plus 回顾 3 1.3.1 连接到数据库 3 1.3.2 配置SQL*Plus环境 4 1.3.3 执行命令 6 1.4 5 个核心的SQL语句 8 1.5 SELECT语句 8 1.5.1 FROM子句 9 1.5.2 WHERE子句 11 1.5.3 GROUP BY子句 11 1.5.4 HAVING子句 12 1.5.5 SELECT列表 12 1.5.6 ORDERBY子句 13 1.6 INSERT语句 14 1.6.1 单表插入 14 1.6.2 多表插入 15 1.7 UPDATE语句 17 1.8 DELETE语句 20 1.9 MERGE语句 22 1.10 小结 24 第2章 SQL执行 25 2.1 Oracle架构基础 25 2.2 SGA-共享池 27 2.3 库高速缓存 28 2.4 完全相同的语句 29 2.5 SGA-缓冲区缓存 32 2.6 查询转换 35 2.7 视图合并 36 2.8 子查询解嵌套 39 2.9 谓语前推 42 2.10 使用物化视图进行查询重写 44 2.11 确定执行计划 46 2.12 执行计划并取得数据行 50 2.13 SQL执行——总览 52 2.14 小结 53 第3章 访问和联结方法 55 第4章 SQL是关于集合的 95 第5章 关于问题 116 第6章 SQL执行计划 137 第7章 高级分组 170 第8章 分析函数 197 第9章 Model子句 225 第10章 子查询因子化 254 第11章 半联结和反联结 292 第12章 索引 334 第13章 SELECT以外的内容 360 第14章 事务处理 386 第15章 测试与质量保证 415 第16章 计划稳定性与控制 443
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

菜菜的中年程序猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值