当前位置: 首页 > 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函数式编程(一)
  • Mysql优化
  • Nacos系列:Nacos的Java SDK使用
  • spring boot 整合mybatis 无法输出sql的问题
  • SQLServer插入数据
  • V4L2视频输入框架概述
  • WinRAR存在严重的安全漏洞影响5亿用户
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 不上全站https的网站你们就等着被恶心死吧
  • 搞机器学习要哪些技能
  • 给github项目添加CI badge
  • 基于组件的设计工作流与界面抽象
  • 浏览器缓存机制分析
  • 前端技术周刊 2019-01-14:客户端存储
  • 区块链将重新定义世界
  • 我看到的前端
  • 消息队列系列二(IOT中消息队列的应用)
  • 阿里云服务器购买完整流程
  • ​MySQL主从复制一致性检测
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (145)光线追踪距离场柔和阴影
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (三)docker:Dockerfile构建容器运行jar包
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .mysql secret在哪_MySQL如何使用索引
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net 按比例显示图片的缩略图
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • []FET-430SIM508 研究日志 11.3.31
  • [AIGC] MySQL存储引擎详解
  • [Angular] 笔记 9:list/detail 页面以及@Output