Oracle ROWID具体解释
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具体解释的更多相关文章
- 【转】Oracle执行计划解释
Oracle执行计划解释 一.相关的概念 Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的. 对每个表都有一个rowid的伪列,但是表中并不物 ...
- oracle rowid 详解
oracle rowid详解 今天是2013-09-15,存储在数据库中的每一行数据都有一个地址,oracle使用rowid数据类型在存储地址.rowid有如下类别: 1)physical rowid ...
- KingbaseES CTID 与 Oracle ROWID
熟悉oracle的人都知道ROWID可用于快速的数据访问,KingbaseES 由于自身MVCC机制的原因,ctid 作为 oracle rowid 的替代方案不合适,但currtid 还是基本可以满 ...
- ORACLE rowid,file# 和 rfile#
rowid简介 rowid就是唯一标志记录物理位置的一个id,在oracle 8版本以前,rowid由file#+block#+row#组成,占用6个bytes的空间,10 bit 的 file# , ...
- Oracle rowid
本文讨论的是关于oracle从8i开始引进object的概念后的rowid,即扩展(extended)的rowid:1.rowid的介绍先对rowid有个感官认识:SQL> select ROW ...
- Oracle Hints具体解释
在向大家具体介绍Oracle Hints之前,首先让大家了解下Oracle Hints是什么,然后全面介绍Oracle Hints,希望对大家实用.基于代价的优化器是非常聪明的,在绝大多数情况下它会选 ...
- oracle rowid 使用
ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置. ROWID可以分为物理rowid和逻辑rowid两种.普通的堆表中的rowid是物理rowid,索引组织表 ...
- Oracle Hints详细解释
特别介绍给大家Oracle Hints之前,让我们知道下Oracle Hints什么,然后好Oracle Hints,我们希望实际.基于成本的优化器是很聪明,在大多数情况下,将选择正确的优化,减少DB ...
- oracle rowid 研究
SQL> create table tab01(id integer,val varchar(4)); Table created. SQL> insert into tab01 valu ...
随机推荐
- C#使用Oracle.ManagedDataAccess.dll
在刚接触C#的时候由于公司使用的就是Oracle数据库,那么C#怎么连接Oracle数据库就成了首要去掌握的知识点了.在那时没有ODP.NET,但visual studio却对Oralce数据库的调用 ...
- JavaScript面向对象(收集整理)
(1)封装 首先理解构造函数:所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量.对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上. f ...
- WebService--axis
axis WebService虽然现在已经很少使用,但是还是把它的配置过程写出来,开发环境jdk 1.6 服务端: 1,导入需要jar包,自行下载 2,创建WebService接口 public in ...
- MYSQL触发器在PHP项目中用来做信息备份、恢复和清空
案例:通过PHP后台代码可以将员工的信息删除,将删除的员工信息进行恢复(类似于从回收站中恢复员工信息),并且还可以将已经删除的员工进行清空(类似于清空回复站的功能). 思路:要有一张员工表,还要有一张 ...
- app.config 配置多项 配置集合 自定义配置(3)
再说说利用app.config配置多个自定义的方法.先看这个例子:美国家庭Simpson的家里有父亲母亲和三个儿女,而中国的老王只有独生子女.结构如下: <?xml version=" ...
- javascript 的继承
我们的JavaScript比较特别了,主要通过原型链实现继承的. 下面介绍各种实现继承的方式:原型链继承,借用构造函数,组合继承,原型式继承,寄生式继承,寄生组合式继承. 二.实现继承方式 1.原型链 ...
- Linux系列教程(二十四)——Linux的系统管理
上篇博客介绍了Linux的服务管理,不管是以RPM包安装的服务,还是通过源码包安装的服务,万能启动服务的方法都可以通过 /绝对路径/启动脚本名 start .而通过 RPM 包安装的服务还可以通过 s ...
- android studio 的自动更新问题
地址背墙了 没办法... 只有另寻他法了: 在Android Studio安装目录/bin/studio(对应版本, x86, x64).vmoptions文件中追加以下几行 -Djava.net.p ...
- HTML基础上
知识点一:HTML Hyper Text Markup Language 超文本标记语言. HTML标准结构: < ! doctype html> 声明文档类型 <html> ...
- JAVA基础5——与String相关的系列(1)
与String相关的系列 String, 是JAVA中常见的一个引用类型,且其具有一定的特殊性. String类型被设置为final型,即不可继承,也就不可修改其中的实现. String可以改变吗 S ...