oracle的rowid和rdba庖丁解牛

2023-10-27

authorskate

time2010-08-23

 

Oracle 8以下ROWID组成(也叫受限Rowid)为:FFFF.BBBBBBBB.RRRR,占用6个字节(10bit file#+22bit+16bit),但是,为了扩充的需要,如数据文件的扩充,现在的Rowid改为:OOOOOOFFFBBBBBBRRR,占用10个字节(32bit+10bit rfile#+22bit+16bit)。其中,O是对象IDF是文件IDB是块IDR是行ID。由于rowid的组成从file#变成了rfile#,所以数据文件数的限制也从整个库不能超过1023个变成了每个表空间不能超过1023个数据文件。

注意:这里的O,代表的是data_object_id,是与段物理存储位置相关的一个信息,因为一个段对象只可能在一个表空间上,data_object_id能唯一确认ts#,而data_object_id + rfile#就能最终定位到该rowid在那个确定的物理数据文件。

 

如果我们查询一个表的ROWID,就可以获得object的信息,文件信息,块信息与行信息等等,如根据其中块的信息,可以知道该表确切占用了多少个块,每行在哪个块上,哪个数据文件上。

 

我们在select数据时候,在不指定排序字段时, oracle是按rowid升序取数据的。如

SQL> select t.id,rowid from skate.tab2 t;

        ID ROWID

---------- ------------------

   1067511 AAAO1lAAEAAAHKkAAA

   1067513 AAAO1lAAEAAAHKkAAB

   1067515 AAAO1lAAEAAAHKkAAC

   1067517 AAAO1lAAEAAAHKkAAD

   1067519 AAAO1lAAEAAAHKkAAE

   1067523 AAAO1lAAEAAAHKkAAG

   1067525 AAAO1lAAEAAAHKkAAH

   1067527 AAAO1lAAEAAAHKkAAI

8 rows selected

SQL>

 

可以从上面的显示数据看到,是按rowid降序排列。我们拿rowid AAAO1lAAEAAAHKkAAA”来说明

 

Data Object number =AAAO1l

File id                  =AAE     

Block id              =AAAHKk

Row        =AAA

Rowid64进制的,可以通过进制转化工具来查看(http://www.2u3.cn/Conversion/jinzhi/

 

 A-Z <==> 0 - 25 (26)
a-z <==> 26 - 51 (26)
0-9 <==> 52 - 61 (10)
+/ <==> 62 - 63 (2)

 

 拿其中的Data Object number= AAAO1l为例子, 

 

l64进制中的37,位置为0

37 * (64 ^ 0) = 37

164进制中的53,位置为1

53 * (64 ^ 1) = 3392

O64进制中的 14位置为2

14*(64^2)=57344

A64进制中的 0

所以

A * (64 ^ 3) = 0

A * (64 ^ 4) = 0

A * (64 ^ 5) = 0

则有AAAO1l= 0 + 0 + 0 + 57344+ 3392 + 37 = 60773,表示该行存在的对象,对应的对象号为60773

 

手工算还是比较麻烦的,oracle为此提供相应的函数dbms_rowid来实现

SQL> select dbms_rowid.rowid_object('AAAO1lAAEAAAHKkAAA') data_object_id#,

  2         dbms_rowid.rowid_relative_fno('AAAO1lAAEAAAHKkAAA') rfile#,

  3         dbms_rowid.rowid_block_number('AAAO1lAAEAAAHKkAAA') block#,

  4         dbms_rowid.rowid_row_number('AAAO1lAAEAAAHKkAAA') row# from dual;

DATA_OBJECT_ID#     RFILE#     BLOCK#       ROW#

--------------- ---------- ---------- ----------

          60773          4      29348          0

 

可以通过包的说明或者oracle官方手册了解更多,例如:

SQL> desc dbms_rowid

Element                Type      

---------------------- ---------

ROWID_TYPE_RESTRICTED  CONSTANT  

ROWID_TYPE_EXTENDED    CONSTANT  

ROWID_IS_VALID         CONSTANT  

ROWID_IS_INVALID       CONSTANT  

ROWID_OBJECT_UNDEFINED CONSTANT  

ROWID_CONVERT_INTERNAL CONSTANT  

ROWID_CONVERT_EXTERNAL CONSTANT  

ROWID_INVALID          EXCEPTION

ROWID_BAD_BLOCK        EXCEPTION

ROWID_CREATE           FUNCTION  

ROWID_INFO             PROCEDURE

ROWID_TYPE             FUNCTION  

ROWID_OBJECT           FUNCTION  

ROWID_RELATIVE_FNO     FUNCTION  

ROWID_BLOCK_NUMBER     FUNCTION  

ROWID_ROW_NUMBER       FUNCTION  

ROWID_TO_ABSOLUTE_FNO  FUNCTION  

ROWID_TO_EXTENDED      FUNCTION  

ROWID_TO_RESTRICTED    FUNCTION  

ROWID_VERIFY           FUNCTION  

 

SQL> desc dbms_rowid.rowid_info

Parameter     Type     Mode Default?

------------- -------- ---- --------

ROWID_IN      ROWID    IN            

ROWID_TYPE    NUMBER   OUT           

OBJECT_NUMBER NUMBER   OUT           

RELATIVE_FNO  NUMBER   OUT           

BLOCK_NUMBER  NUMBER   OUT           

ROW_NUMBER    NUMBER   OUT           

TS_TYPE_IN    VARCHAR2 IN   Y  

 

如果明白了以上ROWID的含义,那么就很容易理解块的地址rdba了,也就是ROWID中的FFFBBBBBB部分,10bit rfile#+22bit,如我们分析一个块地址:

 rdba: 0x010072a4

0x010072a4转化为10进制16806564

SQL>   select dbms_utility.data_block_address_file(16806564) "file",

  2           dbms_utility.data_block_address_block(16806564) "block"

  3    from dual;

 

      file      block

---------- ----------

         4      29348

 

SQL>

 

现在通过块的dba知道了fileblock,那怎样确认我们推到的正确呢? 这个块地址是dump文件的内容,我们可以去dump文件核对下

Start dump data blocks tsn: 4 file#: 4 minblk 29348 maxblk 29348

buffer tsn: 4 rdba: 0x010072a4 (4/29348)

scn: 0x0000.00e66a1e seq: 0x02 flg: 0x06 tail: 0x6a1e0602

frmt: 0x02 chkval: 0x4590 type: 0x06=trans data

Hex dump of block: st=0, typ_found=1

 

结果我们推导的和dump的内容是一样的,不过这里得到的4rfile#,相对文件号,而相对文件号是不能超过1023,所以,如果你想根据这个地址来dump数据文件块的话,最好还是核对一下v$datafile

select file# from v$datafile where rfile# = 4 and ts# = <:dbfile_in_ts>

 

表空间的ts#可以通过如下sql得到:

  select ta.tablespace_name, da.TS#
    from dba_tablespaces ta, dba_data_files df, v$datafile da
   where ta.tablespace_name = df.tablespace_name
     and da.NAME = df.file_name

 例如:

SQL> select file# from v$datafile where rfile# = 4 and ts# = 4;

 

    FILE#

----------

         4

SQL>

 

如果数据文件数大于1023个,这里file# 就不是4了,应该是个绝对文件号了,这就是file#rfile#的区别。如果dump数据块,要用绝对文件号的,例如:

Alter system dump  datafile 4 block 29348;

 

也可以通过dba_segments,

SQL>  select header_file,header_block from dba_segments where owner='SKATE' and segment_name='TAB2';

 

HEADER_FILE HEADER_BLOCK

----------- ------------

          4        29347

这里段头占有一个block,后面存储的就是数据,所以存储数据的块,应该是29348

 

-----end-----

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

oracle的rowid和rdba庖丁解牛 的相关文章

  • 如何对 SQL 进行多次查询

    我正在尝试创建一个表 并在 PHP 脚本的帮助下在数据库中插入一些值 虽然只插入 1 行 但效果很好 当我尝试输入更多行数时 出现错误 我需要为每个查询编写完整的插入语句 因为我正在使用在线 Excel 到 SQL 查询转换器
  • 在 C 中通过引用传递数组

    我是 C 新手 我有一个疑问 由于 C 函数创建其参数的本地副本 我想知道为什么以下代码按预期工作 void function int array array 0 4 array 1 5 array 2 6 int main int arr
  • 如何使用 MySQL 选择有特定值的 2 个连续行?

    我正在构建一个系统 该系统应该显示学生何时连续缺席两天 例如 此表包含缺勤情况 day id missed 2016 10 6 1 true 2016 10 6 2 true 2016 10 6 3 false 2016 10 7 1 tr
  • 如何将所有父母的父母作为循环引用表中子对象的列?

    我有一个表格 其中有类似的列 entityID entityName parentID 我如何编写一个查询来返回实体的所有父级级别 以返回类似的内容 childentityname parentlevel1name parentlevel2
  • hive - 在值范围之间将一行拆分为多行

    我在下面有一张表 想按从开始列到结束列的范围拆分行 即 id 和 value 应该对开始和结束之间的每个值重复 包括两者 id value start end 1 5 1 4 2 8 5 9 所需输出 id value current
  • Oracle REGEXP_INSTR() 和“a-z”字符范围与预期不匹配

    我想用REGEXP INSTR 在 oracle 数据库中检查小写 大写字符 我知道 upper and lower POSIX 字符类 但我选择了a z这给了我非常奇怪的结果 我不明白 有人可以解释一下吗 SELECT REGEXP IN
  • 如何使用 SQL 查询创建逗号分隔的列表?

    我有 3 个表 名为 应用程序 ID 名称 资源 id 名称 应用程序资源 id app id resource id 我想在 GUI 上显示所有资源名称的表格 在每一行的一个单元格中 我想列出该资源的所有应用程序 以逗号分隔 所以问题是
  • 替换字符串中的多个字符,而不使用任何嵌套替换函数

    我的表中存储了一个方程 我一次获取一个方程 并希望将所有运算符替换为任何其他字符 输入字符串 N 100 6858 6858 N 100 0 2 N 35 运算符或模式 替换字符 输出字符串 N 100 6858 6858 N 100 0
  • mysql GROUP_CONCAT 重复项

    我从 farmTOanimal 表中进行连接 如下所示 有一个类似的farmTotool表 id FarmID animal 1 1 cat 2 1 dog 当我在视图中加入表时 我得到的结果如下所示 FarmID animal tool
  • 处理ON INSERT触发器时,innodb表如何锁定?

    我有两个 innodb 表 articles id title sum votes 1 art 1 5 2 art 2 8 3 art 3 35 votes id article id vote 1 1 1 2 1 2 3 1 2 4 2
  • SQLite SQL 查询出现问题[重复]

    这个问题在这里已经有答案了 我正在尝试在 SQLite 3 中运行以下查询 SELECT DISTANCE latitude longitude AS distance FROM country WHERE id NOT LIKE HAVI
  • 就SQL注入而言,哪种sql查询更安全

    我有两个 SQL 查询正在尝试更新sup and opp每次调用查询时 值分别为 1 和 1 第一个查询 query update disc set sup sup opp opp where did did int sup getnoof
  • 如何关闭与数据库的现有连接

    我想关闭与 MS SQL Server 的现有连接 以便可以通过编程方式对该数据库进行恢复 这应该会断开其他所有人的连接 并使您成为唯一的用户 alter database YourDb set single user with rollb
  • 使用来自另一个的 SELECT 更新表,但字段为 SUM(someField)

    基本上我有这样的事情 UPDATE Table SET Table col1 other table col1 FROM Table INNER JOIN other table ON Table id other table id 问题是
  • PostgreSQL 和锁定

    希望一些比我更聪明的 DBA 可以帮助我找到一个好的解决方案来完成我需要做的事情 为了便于讨论 我们假设我有一个名为 work 的表 其中包含一些列 其中一列表示给定客户端对该行工作的所有权 场景是 我将连接 2 个客户端并轮询表以查找要完
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • Oracle - 将字符串与 utl_raw.cast_to_varchar2 函数的结果连接起来

    我正在尝试将字符串连接到结果utl raw cast to varchar2函数 也是一个字符串 它应该是透明的 但我无法将任何内容附加到结果中utl raw cast to varchar2 这是一个例子 select utl raw c
  • MySQL 正在将我的时间戳值转换为 0000-00-00

    我是 PHP 新手 目前仍在学习中 我认为我的注册表有问题 username password email全部成功插入MySQL registered and last seen不要 我以为我正在使用getTimestamp 错了 但它呼应
  • 如何在审计触发器中使用system_user但仍使用连接池?

    我想做以下两件事 在我的数据库表上使用审计触发器来识别哪个用户更新了什么 使用连接池来提高性能 对于 1 我在数据库触发器中使用 system user 来识别进行更改的用户 但这阻止我执行需要通用连接字符串的 2 有没有一种方法可以让我充
  • Oracle SQL-根据记录的日期与历史记录标记记录

    这是我在论坛上的第一篇文章 通常我能够找到我需要的东西 但说实话 我不太确定如何针对该问题提出正确的问题 因此 如果论坛上已经有答案而我错过了 请接受我的歉意 我通过 Benthic Software 在 Oracle 数据库中运行以下代码

随机推荐

  • 零基础学习OSI七层网络模型

    目录 1 应用层 2 物理层 3 数据链路层
  • angular测试API

    1 resetTestEnvironment 是 Angular 测试中的一个函数 用于重置测试环境 它通常与 initTestEnvironment 和 platformBrowserDynamicTesting 一起使用 以确保在多个测
  • 构建安全的数据访问-威胁与对策(一)

    威胁与对策 要构建安全的数据访问代码 需要了解数据访问代码中的威胁是什么 常见漏洞是如何产生的以及如何使用适当的对策来降低风险 数据访问代码面临的主要威胁包括 SQL 注入 配置数据的泄漏 敏感应用程序数据的泄漏 数据库架构和连接详细信息的
  • 安装配置minicom

    安装配置minicom lsmod grep usbserial 如果直接使用串口线 而没有用到USB转串口设备 此步可以跳过 如果有usbserial 说明系统支持USB转串口 安装minicom Fedora自带有minicom 此步可
  • 永恒之蓝全过程复现

    一 永恒之蓝简介 永恒之蓝是指2017年4月14日晚 黑客团体Shadow Brokers 影子经纪人 公布一大批网络攻击工具 其中包含 永恒之蓝 工具 永恒之蓝 利用Windows系统的SMB漏洞可以获取系统最高权限 5月12日 不法分子
  • 通过IP地址和子网掩码,如何计算出网络地址、广播地址和主机数?

    Q 通过IP地址和子网掩码 如何计算出网络地址 广播地址和主机数 A 知道知道IP地址和子网掩码后 通过 IP地址和子网掩码的 与 运算 可以计算出以下相关地址 1 网络地址 2 广播地址 3 地址范围 4 本网有几台主机 例1 下面例子I
  • 掌握这些GitHub搜索技巧,你的开发效率将翻倍!

    作为开发it行业一员 学习借鉴他人项目是很有必要的 所以我们一般都会从github或者 Gitee 上面去参考借鉴他人的项目来学习增加自己的项目经验 但是一般我还是在github上看项目比较多 毕竟人家实力项目量摆在那里 但是国内访问git
  • 数学实践3 - C++下的稀疏矩阵(Sparse Matrix)迭代求解

    目录 问题描述 稀疏矩阵的迭代求解 算法 Jacobi求解法 原理 收敛性 Konvergenz 终止条件 共轭梯度法 CG Verfahren 原理 收敛性 终止条件 C 下的算法实现 用哈希表储存稀疏矩阵 std unordered m
  • Vue项目不断请求 ‘websocket‘ 问题

    项目 Vue 2 6 10 报错原因 由于我对 Apache 配置了端口转发 www xxx com 至 localhost 8080 因而使得 webpack dev server 出于安全考虑 默认检查 hostname 检查到 hos
  • 在VCenter中进入bash命令行

    一 VCenter开启远程登录 登录VCenter管理地址 https VCIP 5480进入登录界面 输入用户名和密码登录 在访问 访问设置中将ssh登录和bash shell打开 二 远程登录VCenter 用root用户登录VCSA命
  • #pragma once 与 #ifdef

    解析 pragma指令 在所有的预处理指令中 Pragma 指令可能是最复杂的了 它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作 pragma指令对每个编译器给出了一个方法 在保持与C和C 语言完全兼容的情况下 给出主机或操作
  • 老卫带你学---HMAC哈希算法

    HMAC哈希算法 HMAC哈希算法是加密后的哈希算法 需要我们指定hash算法 md5 sha1 sha256 sha512 与一个密钥key 来进行hash 加密操作 要比单纯的hash更加安全
  • cocos2d-x多分辨率适配方案:setDesignResolutionSize使用

    cocos2d x多分辨率适配方案 setDesignResolutionSize使用 原文链接 http gpra pkstudio org archives 217 cocos2d x是一个优秀的跨平台游戏引擎 当然跨平台超容易遇到的分
  • 如何利用代码快速生成mapper.xml的<resultMap>

    一 问题引入 当我们开发 mapper xml gt dao接层 gt service接口 gt serviceImp gt controller层 其中在mapper xml编写查询语句的sql时会遇到sql查询到的结果 涉及到多张表的字
  • LeetCode22. 括号生成

    22 括号生成 题目链接 解题思路 创建组合原理 先放左括号 再放右括号 左括号数不能超过 n 右括号数要与右括号数一致 public List
  • pfc后处理/pfc内置Python后处理(应力云图)

    二维 三维节理玫瑰花图绘制 三维组构图 pfc内置Python绘制应力 位移云图 曲线图 接触模型图 大量优质后处理文件 程序 源码直出 不需要截图 可二次开发 xianyu请关注 南美洲滑翔丁香 具体效果如下
  • IPV6简介

    文章目录 思维导图 简介 改近点 地址表示 地址分类 单播地址 组播地址 任播地址 特殊地址 ICMPv6 地址配置 IPV6的路由配置 静态路由 RIPNG OSPFV3 MP BGP IPV4到IPV6的过渡技术 GRE 6TO4Tun
  • 写出高质量代码的标准

    在平时的编码中 或多或少有这样的感觉 看别人的代码是一个重新整理和再认识的过程 当自己接收的别人的代码时 虽然里面用到的技术自己可能不是太清楚 但是自己知道他写的怎么样 好的代码给人一种赏心悦目的感觉 而不规整 一团乱麻的代码会降低人的维护
  • vue-element上传组件,请求头加入token,上传格式判断

  • oracle的rowid和rdba庖丁解牛

    author skate time 2010 08 23 Oracle 8以下ROWID组成 也叫受限Rowid 为 FFFF BBBBBBBB RRRR 占用6个字节 10bit file 22bit 16bit 但是 为了扩充的需要 如