一直以来,Oracle的发展是如火如荼,依然非常成熟,无论是行业的人员和资料的丰富程度。对于数据库的体系结构的内容,下面这张图我估计很多DBA都快看吐了,每次一提起体系结构,总是会看到这张图。

而看着10年前的图,发现依旧能讲出不少的东西,很多技术的改变都是添砖加瓦,而动地基之类的改动,那就相当难了,从12c的体系结构可以看出,Oracle真是下了血本了,根深蒂固的基础架构都要动,而且这个架构貌似以前还是在SQL Server已经有成形的使用。

我想说的是,技术的发展,我们都是其中的分子或者分母,如果说ROWID这个概念有什么可值得深挖的,估计想想都不大可能。一方面很多人可能因为一些特殊原因了解到它的存在,另一方面似乎它可用的空间就不是很大,而且如果想继续深究它的具体实现方式,这个就更难了。

先来说说ROWID的组成,如果说ROWID的格式如下:

OOOOOO.FFF.BBBBBB.RRR

那么OOOOOO就是OBJECT_ID,可以通过DBA_OBJECTS查得。

FFF是对应的数据文件号,可以通过DBA_DATA_FILES或者是V$DATAFILE查到

BBBBBB是数据块号,这一点尤其值得说一说,数据字典层面,Oracle对外开放的数据字典,最细粒度也就是dba_extents了,如果想看到更细节的数据块的信息,那也就只有ROWID可以看到了。

而RRR是对应的行数,也就是row  number

ROWID看起来如此强大,能够定位到如此细节的信息,那么ROWID我们有什么快捷的方式来查看和管理呢,我们能够像到的就是DBMS_ROWID了。

比如下面的语句,能够查到一些很详细的信息。

select

rowid as therowid, id,

dbms_rowid.rowid_object(rowid) as objid,

dbms_rowid.rowid_relative_fno(rowid) as relfilenum,

dbms_rowid.ROWID_RELATIVE_FNO(rowid) as absfilenum,

dbms_rowid.rowid_block_number(rowid) as blocknum,

dbms_rowid.rowid_row_number(rowid) as rowslot

from t where id in(1, 2, 500, 501)

order by id;

THEROWID                  ID      OBJID RELFILENUM ABSFILENUM  BLOCKNUM    ROWSLOT

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

AAAVs+AABAAAXHJAAA          1      88894          1          1      94665          0

AAAVs+AABAAAXHJAAB          2      88894          1          1      94665          1

AAAVs+AABAAAXHJAHz        500      88894          1          1      94665        499

AAAVs+AABAAAXHJAH0        501      88894          1          1      94665        500但是可能你也有一种疑惑,这个ROWID看起来格式还真不简单,到底是咋实现的呢? DBMS_ROWID是不会披露这些信息的,毫无疑问,这些内容是肯定被加密的。

我们有什么其他的办法来解读呢。首先一种说法是ROWID是根据base64来编码的。我们有没有办法来试一试,这一点还真找到了同样想法的技术友人,感兴趣可以参考这篇。

https://www.experts-exchange.com/articles/931/Decoding-the-Oracle-ROWID-and-some-Base64-for-fun.html

我们来简单测试一下。

首先是数据初始化,我们建立一个表,插入10000条数据,两个SQL轻松搞定。

create table t( id integer primary key,name varchar(1));

insert into t select level,'A' name from dual connect by level<=10000;

我们查看几行数据。

SQL> select rowid from t where id<=2;

ROWID

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

AAAVs+AABAAAXHJAAA

AAAVs+AABAAAXHJAAB

末尾的3位是行数,那么我们解读一下它吧。

SQL> select substr(rowid, 16, 3)

from t where id <= 2;

SUBSTR(ROWID,16,3)

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

AAA

AAB这一点很显然就是如此,没有什么特别之处,而base64是要求至少24位,所以我们可以尝试再补充一位。

SQL> select LPAD(substr(rowid, 16, 3), 4, 'A')

from t where id <= 2;

LPAD(SUBSTR(ROWID,16,3),

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

AAAA

AAAB

下面的这个步骤就很值得玩味了,那就是使用base64的方法来处理。

SQL> select utl_encode.base64_decode(utl_raw.cast_to_raw(lpad(substr(rowid, 16, 3), 4, 'A')))

from t where id in(1, 2, 500, 501);

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

000000

000001

0001F3

0001F4可以看出这个现实的结果是行数,但是实际上这个是十六进制的方式。沃恩需要再这个基础上进一步转换。

SQL> select to_number(utl_encode.base64_decode(utl_raw.cast_to_raw(lpad(substr(rowid, 16, 3), 4, 'A'))), 'XXXXXX') as rowslot

from t where id in(1, 2, 500, 501);

ROWSLOT

----------

0

1

499

500

如此一来,整个过程是清晰了很多,那么这个说法到底是否靠谱呢。

我们可以使用它来得到和dbms_rowid同样的效果。

select rowid as therowid, id,

to_number(utl_encode.base64_decode(utl_raw.cast_to_raw(lpad(substr(rowid,1, 6), 8, 'A'))), 'XXXXXXXXXXXX') as objid,

to_number(utl_encode.base64_decode(utl_raw.cast_to_raw(lpad(substr(rowid, 7, 3), 4, 'A'))), 'XXXXXX') as filenum,

to_number(utl_encode.base64_decode(utl_raw.cast_to_raw(lpad(substr(rowid, 10, 6), 8, 'A'))), 'XXXXXXXXXXXX') as blocknum,

to_number(utl_encode.base64_decode(utl_raw.cast_to_raw(lpad(substr(rowid, 16, 3), 4, 'A'))), 'XXXXXX') as rowslot

from t where id <= 2  ;

THEROWID                  ID      OBJID    FILENUM  BLOCKNUM    ROWSLOT

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

AAAVs+AABAAAXHJAAA          1      88894          1      94665          0

AAAVs+AABAAAXHJAAB          2      88894          1      94665

所以说如此一来整个ROWID的实现方式就一目了然了,而在这个测试中如果结合ROWNUM其实也就更有意思了。我们后续来揉在一起来对比一下。

oracle获取rowid,Oracle中的ROWID实现相关推荐

  1. oracle 获取每周五,Oracle获取周几以及每周对应得开始日期和结束日期

    Oracle获取周几以及每周对应得开始日期和结束日期 --获取近一年周的开始日期和结束日期,从星期日开始 select '2014'||sunday.the_week,decode(sign(sund ...

  2. oracle获取用户名,Oracle 用户名详解

    安装ORACLE时,若没有为下列用户重设密码,则其默认密码如下: 用户名/密码 登录身份 说明 sys/change_on_install SYSDBA或SYSOPER 不能以NORMAL登录,可作为 ...

  3. oracle 获取每周五,oracle如何根据传入的时间参数,得到这个参数所在周的周一至周五的日期和星期数...

    select '1' AS XQBH,to_char(trunc(to_date('2020-06-28' ,'yyyy-mm-dd'),'iw'),'yyyy-mm-dd') AS RQ,'星期一' ...

  4. Oracle中的Rowid

    这篇文章是参考甲骨论老相老师的教学视频 http://v.youku.com/v_show/id_XMzkyMjE3NTA0.html 所做的学习笔记. 1.什么是Rowid 这里的Rowid,并不是 ...

  5. oracle z中rowid,oracle 10g中的ROWID

    1 ROWID的特性 (1)rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行. (2)rowid是存储在索引中的一组既定的值(当行确定后).我们可以像表中普 ...

  6. oracle中rowid列,Oracle中的rowid

    ROWID是ORACLE中的一个重要的概念.用于定位数据库中一条记录的一个相对唯一地址值.通常情况下,该值在该行数据插入到数据库表时即被确定且唯一.ROWID它是一个伪列,它并不实际存在于表中.它是O ...

  7. oracle rowID切片,Oracle中的rowid

    ROWID是ORACLE中的一个重要的概念.用于定位数据库中一条记录的一个相对唯一地址值.通常情况下,该值在该行数据插入到数据库表时即被确定且唯一.ROWID它是一个伪列,它并不实际存在于表中.它是O ...

  8. oracle中中rowid,oracle中的Rowid和Urowid

    Oracle使用rowid数据类型存储行地址,rowid可以分成两种,分别适于不同的对像 Physical rowids:存储ordinary table,clustered table,table ...

  9. ORACLE中的rowid用法

    rowid概述 rowid是一个用来唯一标记表中行的伪列.它是物理表中行数据的内部地址,包含两个地址,其一为指向数据表中包含该行的块所存放数据文件的地址,另一个是可以直接定位到数据行自身的这一行在数据 ...

  10. oracle 切割 rowid,Oracle中rowid的用法(全面)

    ROWID是数据的详细地址,通过rowid,Oracle可以快速的定位某行具体的数据的位置. ROWID可以分为物理rowid和逻辑rowid两种.普通的堆表中的rowid是物理rowid,索引组织表 ...

最新文章

  1. ida 调试中call stack如何打开|修改数值
  2. 手把手教你写网络爬虫(4)Scrapy入门
  3. ImportError: cannot import name ‘image‘ from ‘PIL‘ (C:\ProgramData\Anaconda3\lib\site-packages\PIL\_
  4. linux ctime 时间戳,关于LINUX三种时间戳的详细说明(带实验)
  5. A Juggling Algorithm (旋转交换)
  6. 刷卡读取信息自动录入表格_人事自动化管理系统.xls
  7. 引入css外部样式表的注意事项
  8. 首届 “女生科技体验节” 大爆料!
  9. .NET 安全编程 阅读笔记(四)
  10. mysql FROM_UNIXTIME 格式化MYSQL时间戳函数
  11. centos7虚拟机网桥模式不通_Centos7虚拟机桥接模式
  12. python numpy库数组的存取
  13. 书单(三)-从小到大课外阅读书籍顺序
  14. Qt与Mysql进行连接实现账号的注册登录和密码修改和验证码
  15. 下注玩客币到重仓公链,迅雷的区块链转型之路
  16. 怎么自定义服务器的404,如何自定义404页面
  17. 基于Cookie-Editor与curl实现跨设备的文件下载
  18. 写给父亲的语音计算器(语音的加载播放C#,四)
  19. 工业通讯 | STM32F4xx应用控制器与SoM集成 Ⅱ
  20. 腾讯云一元服务器搭建个人网站详细教程

热门文章

  1. 5222. 【GDOI2018模拟7.12】A
  2. python画圆及其内接多边形_python画出三角形外接圆和内切圆的方法
  3. 深度 | 驭势仿真实景建模技术,构筑无人驾驶的商业化世界
  4. 在线sqli-labs 通关大全 Less-2
  5. 前端经典面试题(二)-李游Leo-专题视频课程
  6. 深度|Web3.0时代的范式之变
  7. EasyExcel读取Excel日期为数字如何解决
  8. oak深度相机入门教程-行人重识别
  9. CCSprite:精灵
  10. jQuery实现表格的增加、修改、删除、保存。