oracle中rowid列,Oracle中的rowid

ROWID是ORACLE中的一个重要的概念。用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。ROWID它是一个伪列,它并不实际存在于表中。它是ORACLE在读取表中数据行时,根据每一行数据的物理地址信息编码而成的一个伪列。所以根据一行数据的ROWID能找到一行数据的物理地址信息。从而快速地定位到数据行。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。

要理解索引,必须先搞清楚ROWID。

B-Tree索引的每个索引条目具有两个字段。第一个字段表示索引的键值,对于单列索引来说是一个值;而对于多列索引来说则是多个值组合在一起的。第二个字段表示键值所对应的记录行的ROWID。所以索引能加快查询速度!

索引值→ROWID->将ROWID换算成一行数据的物理地址->得到一行数据

一、ROWID的格式:

16c286d910427e01a2ebae8480c412d1.png

第一部分6位表示:该行数据所在的数据对象的 data_object_id;

第二部分3位表示:该行数据所在的相对数据文件的id;

第三部分6位表示:该数据行所在的数据块的编号;

第四部分3位表示:该行数据的行的编号;

索引就是保存了rowid后三个部分的信息。索引是物理存在的,而rowid是伪列。所以索引可以用来快速地定位到数据行。

data_object_id

下面以SAKILA数据库的ACTOR表为例

这里我们要注意将 data_object_id与 object_id区分开来,前者是oracle为它的每一个对象唯一分配的id,而后者与表ACTOR对应的“段”有关,是存放表tt的段的id,也就是与存放表tt中数据的物理位置有关:

select owner,object_id,data_object_id,status from dba_objects where object_name='ACTOR';

d22fa32a782a7088384ceceebf394937.png

alter table ACTOR move tablespace users;

select owner,object_id,data_object_id,status from dba_objects where object_name='ACTOR';

146130fe90b8b60732edad227c40db0c.png

我们看到当表ACTOR move到了users表空间时,段发生了改变,物理位置发生了变化,从而 DATA_OBJECT_ID也发生了变化。我们知道表是存放在“表段”中的,索引是存放在“索引段”中的。DATA_OBJECT_ID就是表示存放数据的“数据段对象的id”

相对文件编码

关于相对文件编码和绝对文件编号:相对文件id是指相对于表空间,在表空间唯一,绝对文件是指相当于全局数据库而言的,全局唯一;

select file_name,file_id,relative_fno from dba_data_files;

eee0d33ae30499ce6ed71853c824a4b0.png

rowid采用64进制来编码

编码方法是:A~Z表示0到25;a~z表示26到51;0~9表示52到61;+表示62;/表示63;刚好64个字符。

Base64编码表

码值

字符

码值

字符

码值

字符

码值

字符

0

A

16

Q

32

g

48

w

1

B

17

R

33

h

49

x

2

C

18

S

34

i

50

y

3

D

19

T

35

j

51

z

4

E

20

U

36

k

52

0

5

F

21

V

37

l

53

1

6

G

22

W

38

m

54

2

7

H

23

X

39

n

55

3

8

I

24

Y

40

o

56

4

9

J

25

Z

41

p

57

5

10

K

26

a

42

q

58

6

11

L

27

b

43

r

59

7

12

M

28

c

44

s

60

8

13

N

29

d

45

t

61

9

14

O

30

e

46

u

62

+

15

P

31

f

47

v

63

/

二、使用rowid访问数据的执行计划

SELECT t.*, ''||t.ROWID FROM "SAKILA"."ACTOR" t;

ff88010c2145613a35028295738ec307.png

EXPLAIN PLAN FOR

select * FROM ACTOR where rowid='AAAYEVAAJAAAACrAAA';

select * from table(DBMS_XPLAN.DISPLAY)

efd94ab604e78b7df63319aab128fb43.png

三、例子:如何从rowid计算得到obj#,rfile#,block#,row#

我们演示一下具体的计算方法:

SELECT t.*, ''||t.ROWID FROM "SAKILA"."ACTOR" t;

a1e8b2782efb9c5f07ff9ff20502a90c.png

表sakila的 data_object_id 为 AAAYEVAAJAAAACrAAA的前6位:AAAYEV,那么我们来计算一下 AAAYEV的值到底是多少:

查询Base64编码表

码值

字符

0

A

24

Y

4

E

21

V

select 24 * 64 * 64 + 4 * 64 + 21 from dual;

AAAYEV=24 * 64 * 64 + 4 * 64 + 21=98581

然后我们查询字典表,看两种方法得到的值是否相等:

select owner,object_id,data_object_id,status from dba_objects where object_name='ACTOR';

f504bfef0013ef0e764daa7fce9a54f8.png

我们看到通过rowid计算得到的data_object_id和通过字典表查到的值相等!

表ACTOR的相对文件编号为 AAAYEVAAJAAAACrAAA的中的 AAJ,显然查表可知 AAJ= 9;

我们在再来查询字典表:

c7eddacf1166631ee17e6a899c979bf1.png

可以看到字典表显示relative_fno为9的数据文件为C:\APP\ORACLE\ORADATA\ORCL\PDBORCL\SAMPLE_SCHEMA_USERS01.DBF

查询当前数据库中的users表空间和对应的数据文件

select file_name,tablespace_name from dba_data_files;

0fad0014be1eb15e186b2c90097c519e.png

两者结果一致。

而我们前面执行过:alter table ACTOR move tablespace users;所以两种方式得到的结果是一致的。

表ACTOR中的第一行数据存放的block的编号为 AAAYEVAAJAAAACrAAA中的 AAAACr,而AAAACr =2*64+43=171

表ACTOR中的第一行数据存放的行的编号为AAAYEVAAJAAAACrAAA中的 AAA,显然值为0,即第一行。

我们也可以通过Oracle提供的存储过程来计算出上面的值:

SELECT

dbms_rowid.rowid_object (ROWID) data_object_id,

dbms_rowid.rowid_relative_fno (ROWID) relative_fno,

dbms_rowid.rowid_block_number (ROWID) block_no,

dbms_rowid.rowid_row_number (ROWID) row_no

FROM

ACTOR;

3c83331a2f8a4d3c3b23835db4beed08.png

显然这个结果和我们手动计算的结果是一致的。

参考

oracle中的rowid和数据行的结构

在oracle数据库系统中每一行都有一个rowid,oracle数据库系统就是利用rowid来定位数据行的.rowid也是oracle中内置的一个标量数据类型 rowid有一下特点; 是数据库中每一行 ...

Oracle中的rowid rownum

1. rowid和rownum都是虚列 2. rowid是物理地址,用于定位oracle中具体数据的物理存储位置 3. rownum则是sql的输出结果排序,从下面的例子可以看出其中的区别. rowi ...

mysql中实现oracle中的rowid功能

mysql中没有函数实现,只能自己手动添加变量递增  := 就是赋值,只看红色字体就行 select @rownum:=@rownum+1,img.img_path,sku.sku_name from ...

mysql中实现行号,oracle中的rowid

mysql中实现行号需要用到MYSQL的变量,因为MySql木有rownumber. MYSQL中变量定义可以用 set @var=0 或 set @var:=0 可以用=或:=都可以,但是如果变量用 ...

[转载]mysql中实现行号,oracle中的rowid

mysql中实现行号需要用到MYSQL的变量,因为MySql木有rownumber. MYSQL中变量定义可以用 set @var=0 或 set @var:=0 可以用=或:=都可以,但是如果变量用 ...

【转】oracle中rowid的用法 (全面)

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

oracle中rownum和rowid的区别

rownum和rowid的区别总括: rownum和rowid都是伪列,但是两者的根本是不同的. rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownu ...

Oracle中的rownum,ROWID的 用法

1.ROWNUM的使用——TOP-N分析 使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM. ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的 ...

(转)Oracle中的rownum,ROWID的 用法

场景:在书写oracle的sql语句时候,如果语句不存在主键,需要删除几条重复的记录,这个时候如果不知道oracle中的伪列,就需要把所有的重复记录先删除,再插入.这样做好麻烦,可以通过伪列来定位记录 ...

随机推荐

Linux 中的数值计算和符号计算

不知道经常需要做科学计算的朋友们有没有这样的好奇:在 Linux 系统下使用什么工具呢?说到科学计算,首先想到的肯定是 Matlab,如果再说到符号计算,那就非 Mathematica 不可了.可惜, ...

CSharpGL(4)设计和使用Camera

CSharpGL(4)设计和使用Camera +BIT祝威+悄悄在此留下版了个权的信息说: 主要内容 描述在OpenGL中Camera的概念和用处. 设计一个Camera以及操控Camera的Sate ...

BF算法与KMP算法

BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的 ...

Eclipse JSP/Servlet 环境搭建

Eclipse JSP/Servlet 环境搭建 本文假定你已安装了 JDK 环境,如未安装,可参阅 Java 开发环境配置. 我们可以使用 Eclipse 来搭建 JSP 开发环境,首先我们分别下载 ...

Node安装与环境配置

1.nodejs(npm)安装 下载nodejs(http://nodejs.cn/)安装后,cmd下如输入 node -v  与  npm -v 出现下图版本提示就是完成了NodeJS的安装 2.n ...

jmeter监控服务资源

转:http://www.cnblogs.com/chengtch/p/6079262.html  1.下载需要的jmeter插件 如图上面两个是jmeter插件,可以再下面的链接中下载: https ...

Linux显示所有运行中的进程

Linux显示所有运行中的进程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps aux | less USER PID %CPU %MEM VSZ RSS ...

Python将html转化为pdf

前言 前面我们对博客园的文章进行了爬取,结果比较令人满意,可以一下子下载某个博主的所有文章了.但是,我们获取的只有文章中的文本内容,并且是没有排版的,看起来也比较费劲... 咋么办的?一个比较好的方法 ...

Linux Centos7.x 安装部署Mysql5.7几种方式的操作手册

简述 Linux  Centos7.x 操作系统版本下针对Mysql的安装和使用多少跟之前的Centos6之前版本有所不同的,下面介绍下在centos7.x环境里安装mysql5.7的几种方法: 一. ...

http协议和telnet指令讲解

http协议: 1.http:是网络传输协议:全称为:超文本传输协议: 关系:客户端和服务器的关系: 协议:就是一种规范: 常见的http和https两种,https是http的升级版 http协议: ...

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值