当前位置: 首页 > news >正文

Oracle redo解析之-4、rowid的计算

对rowid的理解

  rowid是数据库的一个伪列,在建立表的时候Oracle会自动为每个表建立ROWID列。伪列实际上不存储在表中,可以从这些伪列中查询值,但不能插入、更新或删除。
  rowid是用来唯一标识一行记录的,是存储每条记录的实际物理地址。

查询某条记录的rowid值

SQL> select ROWID from user_test where rownum<3;

ROWID
------------------
AAAQObAAFAAAACDAAA
AAAQObAAFAAAACFAAA

rowid的格式如下:
1. 数据对象编号: AAAQOb, data_obj#,即obj$
2. 相对文件编号: AAF, file#
3. 块编号: AAAACD, block#
4. 行编号: AAA, slot
复制代码

计算具体的dataobj#, file#, block#, slot

	rowid是base64编码,用A-Z,a-z, 0-9,+,/共64个字符来表示,A表示0,B表示1等等。
	则:	
	data_obj#=AAAQOb=0*64^5 + 0*64^4 + 0*64^3 + 16*64^2 + 14*64^1 + 27*64^0 = 66459
	file#=AAF=0*64^2 + 0*64^1 + 5*64^0 = 5
	block#=AAAACD=2*64^1 + 3*64^0 = 128
	slot=AAA = 0
复制代码

根据data_obj#, file#, block#, slot计算rowid

  实际上就是将十进制数转化成64进制,当然从二进制转换比较简单。
  将二进制数从右往左,6位一组,然后将这6位二进制转成十进制,然后替换成base64的字符即可。

例:
	dataobj#=66444=1 00000011 10001100 = 010000 001110 001100 = 16 14 12 = Q O M = AAAQOM(补齐6位)
	file#=1 = AAB
	block#=70321=1 00010010 10110001 = 010001 001010 110001 = 17 10 49 = R K x = AAARKx
	slot=0 = AAA
则:rowid=AAAQOMAABAAARKxAAA
复制代码

SQL查询出data_obj#,file#,block#,slot的值

SQL> select dbms_rowid.rowid_object(rowid) object_id,
  2  dbms_rowid.rowid_relative_fno(rowid) file_id,
  3  dbms_rowid.rowid_block_number(rowid) block_id,
  4  dbms_rowid.rowid_row_number(rowid) num 
  5  from user_test;

 OBJECT_ID    FILE_ID	BLOCK_ID	NUM
---------- ---------- ---------- ----------
     66459	    5	     131	  0
     66459	    5	     133	  0
复制代码

#总结   根据data_obj#确定数据保存的数据段,根据file#确定数据所在的文件,根据block#确定数据保存在文件的哪里块,根据slot确定数据保存在块中的哪一行,因此根据rowid可以具体定位数据的位置。对数据库中记录行的最快检索操作就是通过rowid来进行查找的。

相关文章:

  • D语言/DLang 2.085.1 发布,修复性迭代
  • D3.js入门
  • 数据结构中的各种树简单解释
  • 世界冠军之路:菜鸟车辆路径规划求解引擎研发历程
  • shiro app
  • 控制台报错 index:0,size:0
  • 14Linux_BIND-Linux就该这么学
  • WordPress 5.2 Beta 3 发布,要求 PHP 5.6.20 以上版本
  • springboot 2 Hikari 多数据源配置问题(dataSourceClassName or jdbcUrl is required)
  • JAVA 多用户商城系统b2b2c-Spring Cloud Stream 介绍
  • 实现Kubernetes跨集群服务应用的高可用
  • scss rem 转换函数
  • 30K iOS程序员的简述:如何快速进阶成为高级开发人员
  • sysbench安装配置和参数说明
  • Q680 验证回文字符串 Ⅱ
  • 【知识碎片】第三方登录弹窗效果
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Javascript基础之Array数组API
  • java第三方包学习之lombok
  • java中的hashCode
  • Just for fun——迅速写完快速排序
  • python_bomb----数据类型总结
  • quasar-framework cnodejs社区
  • win10下安装mysql5.7
  • 阿里云购买磁盘后挂载
  • 阿里云应用高可用服务公测发布
  • 编写符合Python风格的对象
  • 从零开始学习部署
  • ------- 计算机网络基础
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端面试之闭包
  • 前端知识点整理(待续)
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 移动端高清、多屏适配方案
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​TypeScript都不会用,也敢说会前端?
  • #pragma data_seg 共享数据区(转)
  • (分布式缓存)Redis哨兵
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET企业级应用架构设计系列之技术选型
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @Not - Empty-Null-Blank
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [2010-8-30]
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [android] 请求码和结果码的作用
  • [BZOJ 3680]吊打XXX(模拟退火)