1.ROWID定义

ROWID:数据库中行的全局唯一地址

对于数据中的每一行,rowid伪列返回行的地址。rowid值主要包括下面信息:

  • 对象的数据对象编号
  • 该行所在的数据文件里的数据块
  • 该行中数据块的位置(第一行是0)
  • 数据行所在的数据文件(第一个文件是1)。该文件编号是相对于表空间。

通常来说。一个rowid值唯一标识数据中的一行。然而,存储在同一聚簇中不同的表能够有同样的rowid。

2.扩展ROWID

从Oracle 8i開始使用扩展rowid标识行物理地址

扩展rowid使用base64编码行的物理地址。编码字符包括 A-Z, a-z, 0-9, +, 和 /。

扩展rowid由四部分组成:OOOOOOOFFFBBBBBBRRR:

当中:

  • OOOOOO:数据对象编号(6位显示)
  • FFF:相关数据文件编号(3位显示)
  • BBBBBB:数据块编号(6位显示)
  • RRR:数据块中行编号(3位显示)

3.受限ROWID

为了兼容Oracle8i曾经的应用使用受限rowid标识行物理地址

 受限rowid使用二进制标识行的物理地址,当使用SQL*Plus查询时,二进制被转换为VARCHAR2/十六进制显示。

受限rowid有三部分组成:BBBBBB.RRRR.FFFF(block.row.file):

  • BBBBBB:数据库块编号(6位显示)
  • RRRR:数据块找中行编号(4位显示)
  • FFFF:数据文件编号(4位显示)

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hpY2xld3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

4.ROWID内部存储

对于内部ROWID存储结构,扩展ROWID在大多数平台上採用10个字节存储,受限ROWID6个字节存储。

详细规则例如以下:

  • 数据对象编号-----32bit
  • 数据文件编号------10bit
  • 数据块编号--------22bit
  • 数据块中行编号----16bit

 Oracle 8i曾经,rowid占用6个字节空间,各自是22bit的block#,16bit的row#。10bit的file#。

从Oracle 8i開始,rowid占用10个字节空间。各自是32bit的object#,10bit的rfile#,22bit的block#,16bit的row#。新增了32bit的object#。

受限rowid的file#t基于整个数据库,扩展rowid的rfile#基于表空间。

5.base 64编码

索引

相应字符

索引

相应字符

索引

相应字符

索引

相应字符

0

A

17

R

34

i

51

z

1

B

18

S

35

l

52

0

2

C

19

T

36

k

53

1

3

D

20

U

37

l

54

2

4

E

21

V

38

m

55

3

5

F

22

W

39

n

56

4

6

G

23

X

40

o

57

5

7

H

24

Y

41

p

58

6

8

I

25

Z

42

q

59

7

9

J

26

a

43

r

60

8

10

K

27

b

44

s

61

9

11

L

28

c

45

t

62

+

12

M

29

d

46

u

63

/

13

N

30

e

47

v

14

O

31

f

48

w

15

P

32

g

49

x

16

Q

33

h

50

y

6.Example

创建my_rowid表。通过对my_rowid表的操作来解读rowid。

SQL> create table my_rowid(id number,name varchar2(50));

 

Table created

--插入两行数据

SQL> insert into my_rowid values(1,'whz');

 

1 row inserted

 

SQL> insert into my_rowid values(2,'chiclewu');

 

1 row inserted

6.1查看my_rowid表中行的ROWID

SQL> select rowid,id,name from my_rowid;

 

ROWID                      ID NAME

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

AAATLnAAFAAAAD9AAA          1 whz

AAATLnAAFAAAAD9AAB          2 chiclewu

6.2 ROWID组成格式

SQL> select rowid,

  2         substr(rowid, 1, 6) "#objct",

  3         substr(rowid, 7, 3) "#file",

  4         substr(rowid, 10, 6) "#block",

  5         substr(rowid, 16, 3) "#row"

  6    from my_rowid;

 

ROWID              #objct       #file  #block       #row

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

AAATLnAAFAAAAD9AAA AAATLn       AAF    AAAAD9       AAA

AAATLnAAFAAAAD9AAB AAATLn       AAF    AAAAD9       AAB

将base64编码转换为十进制:

#object:AAATLn -----> 0 0 0 19 11 39(显示字符相应的索引) ----->0*64^5+0*64^4+0*64^3+ 19*64^2+11*64^1+39*64^1 =78567

以此类推,得出:

#file:AAF----------> 5

#block:AAAAD9------> 253

#row:AAA-----------> 0

使用dbms_rowid包获取my_rowid表的信息:

SQL> select rowid,

  2         dbms_rowid.rowid_object(rowid) "#objct",

  3         dbms_rowid.rowid_relative_fno(rowid) "#file",

  4         dbms_rowid.rowid_block_number(rowid) "#block",

  5         dbms_rowid.rowid_row_number(rowid) "#row"

  6    from my_rowid;

 

ROWID                  #objct      #file     #block       #row

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

AAATLnAAFAAAAD9AAA      78567          5        253          0

AAATLnAAFAAAAD9AAB      78567          5        253          1

结论:与base64直接转换的一样。说明#block显示6为,#rfile显示3位,#block显示6位,#row显示3位是对的。

6.3 DUMP函数转换ROWID

为了验证rowid的存储空间为10字节。当中32bit的object#,10bit的rfile#。22bit的block#,16bit的row#。我们须要使用dump函数。

SQL> select rowid,dump(rowid,16) from my_rowid;

 

ROWID              DUMP(ROWID,16)

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

AAATLnAAFAAAAD9AAA Typ=69 Len=10: 0,1,32,e7,1,40,0,fd,0,0

AAATLnAAFAAAAD9AAB Typ=69 Len=10: 0,1,32,e7,1,40,0,fd,0,1

当中,len=10表示是个字节。

AAATLnAAFAAAAD9AAA-->0,1,32,e7,1,40,0,fd,0,0

将十六进制转换为二进制:

0----->00000000

1----->00000001

32---->00110010

e7---->11100111

1----->00000001

40--->01000000

0---->00000000

df--->11011111

0---->0000000

0---->0000000

组合为80bit的rowid:

rowid=00000000000000010011001011100111 0000000101 0000000000000011111101  00000000000000=78567 925 253 0

结论:dump函数转换rowid后,依照32bit的object#。10bit的rfile#,22bit的block#。16bit的row#划分后结果与dbms_rowid包和base64编码的值相等,说明我測试的平台上rowid是依照10个字节存储的,而且每一个内部划分也是正确的。

Oracle ROWID具体解释的更多相关文章

  1. 【转】Oracle执行计划解释

    Oracle执行计划解释 一.相关的概念     Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的. 对每个表都有一个rowid的伪列,但是表中并不物 ...

  2. oracle rowid 详解

    oracle rowid详解 今天是2013-09-15,存储在数据库中的每一行数据都有一个地址,oracle使用rowid数据类型在存储地址.rowid有如下类别: 1)physical rowid ...

  3. KingbaseES CTID 与 Oracle ROWID

    熟悉oracle的人都知道ROWID可用于快速的数据访问,KingbaseES 由于自身MVCC机制的原因,ctid 作为 oracle rowid 的替代方案不合适,但currtid 还是基本可以满 ...

  4. ORACLE rowid,file# 和 rfile#

    rowid简介 rowid就是唯一标志记录物理位置的一个id,在oracle 8版本以前,rowid由file#+block#+row#组成,占用6个bytes的空间,10 bit 的 file# , ...

  5. Oracle rowid

    本文讨论的是关于oracle从8i开始引进object的概念后的rowid,即扩展(extended)的rowid:1.rowid的介绍先对rowid有个感官认识:SQL> select ROW ...

  6. Oracle Hints具体解释

    在向大家具体介绍Oracle Hints之前,首先让大家了解下Oracle Hints是什么,然后全面介绍Oracle Hints,希望对大家实用.基于代价的优化器是非常聪明的,在绝大多数情况下它会选 ...

  7. oracle rowid 使用

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

  8. Oracle Hints详细解释

    特别介绍给大家Oracle Hints之前,让我们知道下Oracle Hints什么,然后好Oracle Hints,我们希望实际.基于成本的优化器是很聪明,在大多数情况下,将选择正确的优化,减少DB ...

  9. oracle rowid 研究

    SQL> create table tab01(id integer,val varchar(4)); Table created. SQL> insert into tab01 valu ...

随机推荐

  1. web前端学习路线和步骤

    H5+全栈工程师  (学习下列技术可以加QQ: 1416 7596 61)第一阶段:初级入门阶段基本功 1.HTML入门 Windows概述.浏览器概述.HTML简介.HTML标签详解.前端开发工具概 ...

  2. mapreduce解析执行sql流程

    样例准备 编号 姓名 性别 班级编号 1 name_1 male 1 2 name_2 female 2 3 name_3 male 3 4 name_4 female 4 5 name_5 male ...

  3. 修改 Sublime 按快捷键 ctrl+s 自动格式化(reindent lines)的问题

    Sublime 工具自带代码格式化的功能,但在某些场景下格式化代码后并不是我们想要的代码格式,且是点击保存ctrl+s才触发的格式代码事件,so,为关闭点击ctrl+s格式代码,我们需要改命令 sav ...

  4. Visual Studio 2017开发环境的安装

    Visual Studio 2017是微软为了配合.NET战略推出的IDE开发环境,同时也是目前开发C#程序最新的工具,本节以Visual Studio 2017社区版的安装为例讲解具体的安装步骤. ...

  5. [转载] JaCoCo:分析单元测试覆盖率的利器

    转载自http://www.ibm.com/developerworks/cn/java/j-lo-jacoco/和http://www.cnblogs.com/chenfengmugu/p/4937 ...

  6. C#进阶--WebApi异常处理机制

    其实对于C#异常处理大家都不陌生,但是对于在WeiApi上的异常处理实际上也和传统异常处理区别不大,但是却经过封装可以让异常更加友好,https://docs.microsoft.com/en-us/ ...

  7. 自动化部署必备技能—部署yum仓库、定制rpm包

    部署yum仓库.定制rpm包 目录 第1章 扩展 - yum缓存 1.1 yum缓存使用步骤... 1 1.1.1 导言... 1 1.1.2 修改配置文件... 1 1.1.3 使用缓存... 1 ...

  8. Python进阶---面向对象第三弹(进阶篇)

    Python对象中一些方法 一.__str__ class Teacher: def __init__(self,name,age): self.name=name self.age=age self ...

  9. linux操作系统基础篇(三)

    1.cat命令 cat除了可以用来查看文本文档还可以将两个文本文档纵向合并到另外一个文本文档中 比如 cat /etc/passwd /etc/group > 1.txt 2. 归纳了所有的压缩 ...

  10. .NET自带缓存机制实例

    using System;using System.Web;using System.Web.Caching;using System.Collections.Generic;using System ...