oracle rowid 优先级,Oracle中rowid的用法(全面)
ROWID是数据的详细地址,通过rowid,Oracle可以快速的定位某行具体的数据的位置。
ROWID可以分为物理rowid和逻辑rowid两种。普通的堆表中的rowid是物理rowid,索引组织表(IOT)的rowid是逻辑rowid。oracle提供了一种urowid的数据类型,同时支持物理和逻辑rowid。本文主要关注物理rowid
物理rowid又分为扩展rowid(extended rowid)和限制rowid(restricted rowid)两种格式。限制rowid主要是oracle7以前的rowid格式,现在已经不再使用,保留该类型只是为了兼容性。所以本文的提到物理rowid一般是指扩展rowid格式。
本文主要内容:
1.Rowid的显示形式
2.如何从rowid计算得到obj#,rfile#,block#,row#
3.如何从obj#,rfile#,block#,row#计算得到rowid
4.Rowid的内部存储格式
5.Index中存储的rowid
1.Rowid的显示形式
我们从rowid伪列里select出来的rowid是基于base64编码,一共有18位,分为4部分:
OOOOOOFFFBBBBBBRRR
其中:
OOOOOO: 六位表示data object id,根据object id可以确定segment。关于data object id和object id的区别,请参考http://www.orawh.com/index.php/archives/62
FFF: 三位表示相对文件号。根据该相对文件号可以得到绝对文件号,从而确定datafile。关于相对文件号和绝对文件号,请参考http://blog.itpub.net/post/330/22749
BBBBBB:六位表示data block number。这里的data block number是相对于datafile的编号,而不是相对于tablespace的编号。
RRR:三位表示row number。
Oracle提供了dbm_rowid来进行rowid的一些转换计算。
SQL> create table test(id int,name varchar2(30));
Table created.
SQL> insert into test values(1,'a');
1 row created.
SQL> commit;
Commit complete.
SQL> select rowid from test;
ROWID
------------------
AAAGbEAAHAAAAB8AAA
SQL> select dbms_rowid.rowid_object(rowid) obj#,
2 dbms_rowid.rowid_relative_fno(rowid) rfile#,
3 dbms_rowid.rowid_block_number(rowid) block#,
4 dbms_rowid.rowid_row_number(rowid) row#,
5 dbms_rowid.rowid_to_absolute_fno(rowid,'SYS','TEST') file#
6 from test;
OBJ# RFILE# BLOCK# ROW# FILE#
----------- ------------ ------------- ---------- ----------
26308 7 124 0 7
2. 如何从rowid计算得到obj#,rfile#,block#,row#
rowid是base64编码的,用A~Z a~z 0~9 + /共64个字符表示。A表示0,B表示1,……,a表示26,……,0表示52,……,+表示62,/表示63可以将其看做一个64进制的数。
所以,
obj#=AAAGbE=6*64^2+27*64+4=26308
rfile#=AAH=7
block#=AAAAB8=64+60=124
row#=AAA=0
3. 如何从obj#,rfile#,block#,row#计算得到rowid
实际上就是将十进制数转化成64进制数,当然,从二进制转化的规则比较简单点。
将二进制数从右到左,6个bit一组,然后将这6个bit组转成10进制数,就是A~Z a~z 0~9 + /这64个字符的位置(从0开始),替换成base64的字符即可。
obj#=26308=110 011011 000100=6 27 4=G b E,补足成6位base64编码,左边填0,也就是A,结果为AAAGbE
rfile#=7=111=7=H,补足成3位,得到AAH
block#=124=1 111100=1 60=B 8,补足成6位,得到AAAAB8
row#=0,3位AAA
合起来就是AAAGbEAAHAAAAB8AAA
4. Rowid的内部存储格式
虽然我们从rowid伪列中select出来的rowid是以base64字符显示的,但在oracie内部存储的时候还是以原值的二进制表示的。一个扩展rowid采用10个byte来存储,共80bit,其中obj#32bit,rfile#10bit,block#22bit,row#16bit。所以相对文件号不能超过1023,也就是一个表空间的数据文件不能超过1023个(不存在文件号为0的文件),一个datafile只能有2^22=4M个block,,一个block中不能超过2^16=64K行数据。而一个数据库内不能有超过2^32=4G个object。
SQL> select dump(rowid,16) from test;
DUMP(ROWID,16)
--------------------------------------------
Typ=69 Len=10: 0,0,66,c4,1,c0,0,7c,0,0
00000000 00000000 01100110 11000100 00000001 11000000 00000000 01111100 00000000 00000000
最右边16bit为row#=00000000 00000000=0
接下来22bit为block#=000000 00000000 01111100=124
接下来10bit为rfile#=00000001 11=7
接下来32bit为obj#=00000000 00000000 01100110 11000100=26308
5. Index中存储的rowid
a. 普通B-tree索引
SQL> create index ix_test on test(id);
Index created.
SQL> select file_id,block_id from dba_extents where segment_name='IX_TEST' and owner=user;
FILE_ID BLOCK_ID
---------- ----------
7 129
---由于是assm表空间,去掉3个block的头
SQL> alter system dump datafile 1 block 132;
System altered.
得到trace文件内容如下(省略无关内容):
row#0[8024] flag: -----, lock: 0
col 0; len 2; (2): c1 02 ---索引键数据ID=1
col 1; len 6; (6): 01 c0 00 7c 00 00 ---对应的rowid记录
----- end of leaf block dump -----
End dump data blocks tsn: 7 file#: 7 minblk 132 maxblk 132
普通索引中保存的rowid是不包括obj#的,但是分区表的global index是包括obj#的,这是因为分区表包括多个segment,每个segment可能在不同的datafile中,根据表的obj#就无法确定该索引键对应的rowid(rfile#确定不了)。
01 c0 00 7c 00 00 转化为二进制 000000001 11000000 00000000 01111100 00000000 00000000
右边8bit row#=0
接下来22bit block#=000000 00000000 01111100=124
接下来10bit rfile#=000000001 11=7
b.唯一索引
SQL> drop index ix_test;
Index dropped.
SQL> create unique index ix_test on test(id);
Index created.
SQL> select file_id,block_id from dba_extents where segment_name='IX_TEST' and owner=user;
FILE_ID BLOCK_ID
---------- ----------
7 129
SQL> alter system dump datafile 1 block 132;
System altered.
得到trace文件内容如下:
row#0[8025] flag: -----, lock: 0, data:(6): 01 c0 00 7c 00 00 ---对应的rowid记录
col 0; len 2; (2): c1 02 ---索引键数据ID=1
----- end of leaf block dump -----
End dump data blocks tsn: 7 file#: 7 minblk 132 maxblk 132
得到rowid为 01 c0 00 7c 00 00,具体的转换计算和前面的一样,就不重复了。
Base64编码说明
Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。
为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换。编码表的大小为2^6=64,这也是Base64名称的由来。
Base64编码表码值字符码值字符码值字符码值字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/
原文链接:http://hi.baidu.com/wwynhm/item/1a376fbc6063b7d084dd79a7
oracle rowid 优先级,Oracle中rowid的用法(全面)相关推荐
- su oracle eof,探讨shell中EOF的用法
在shell脚本中,通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主Shell. EOF只是一个分界符,当然也可以用abcde替 ...
- oracle 函数 epoch,PostgreSQL中epoch的用法
在PG数据库中,extract函数用于从一个日期中获取某个子集,比如获取年,月,日,时,分,秒等.例如: epoch这个字段也可以获取到相应的值,如图: 而epoch的含义官网上的原本解释如下: Fo ...
- Oracle中rowid的用法(全面)
ROWID是数据的详细地址,通过rowid,Oracle可以快速的定位某行具体的数据的位置. ROWID可以分为物理rowid和逻辑rowid两种.普通的堆表中的rowid是物理rowid,索引组织表 ...
- oracle中rowid的用法
rowid概述 rowid是一个用来唯一标记表中行的伪列.它是物理表中行数据的内部地址,包含两个地址,其一为指向数据表中包含该行的块所存放数据文件的地址,另一个是可以直接定位到数据行自身的这一行在数据 ...
- oracle rowID切片,Oracle中rowid的用法
ROWID是数据的详细地址,通过rowid,可以快速的定位某行具体的数据的位置. ROWID可以分为物理rowid和逻辑rowid两种.普通的堆表中的rowid是物理rowid,索引组织表(IOT)的 ...
- oracle 切割 rowid,Oracle中rowid的用法(全面)
ROWID是数据的详细地址,通过rowid,Oracle可以快速的定位某行具体的数据的位置. ROWID可以分为物理rowid和逻辑rowid两种.普通的堆表中的rowid是物理rowid,索引组织表 ...
- oracle中rowid列,Oracle中的rowid
ROWID是ORACLE中的一个重要的概念.用于定位数据库中一条记录的一个相对唯一地址值.通常情况下,该值在该行数据插入到数据库表时即被确定且唯一.ROWID它是一个伪列,它并不实际存在于表中.它是O ...
- oracle z中rowid,oracle 10g中的ROWID
1 ROWID的特性 (1)rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行. (2)rowid是存储在索引中的一组既定的值(当行确定后).我们可以像表中普 ...
- oracle rowID切片,Oracle中的rowid
ROWID是ORACLE中的一个重要的概念.用于定位数据库中一条记录的一个相对唯一地址值.通常情况下,该值在该行数据插入到数据库表时即被确定且唯一.ROWID它是一个伪列,它并不实际存在于表中.它是O ...
最新文章
- 计算机博士点的学校211,数据帖,工科强校一级博士点排名
- 优达学城数据分析师纳米学位——P3项目知识点整理及代码分析 xml文件解析
- myeclispe快捷键一\(≧▽≦)/终于也收藏了
- Android里的shell的系统命令
- linux磁带存储,linux 磁带文件操作分析
- 本地运行flowable_在CockroachDB上运行Flowable
- 33个PPT下载丨2018年PostgreSQL中国技术大会PPT
- 统计与自适应信号处理_时间序列分析 自协方差/自相关系数/偏自相关系数
- 初探机器学习之使用讯飞TTS服务实现在线语音合成
- FMS的安装、基本配置及基本测试
- PMI-ACP敏捷项目认证练习题(四)
- 数据缺失机制以及缺失值处理方式
- JavaScript事件解析
- 上海住房公积金账号系统及查询
- 【OpenGL ES】凸镜贴图
- Golang程序调试 -- 内存泄漏pprof工具
- 程序员找工作的个人经验及注意事项
- 计算机科学数学基础及教材推荐(转)
- 用户画像(profile v.s. persona)
- 如何更改计算机管理员用户名和密码,Win10系统下如何修改administrator管理员账户密码...
热门文章
- 通俗易懂VS项目中的web config配置文件
- python后端从零写项目(一)
- X书作品负面下沉举报脚本
- pandas读文件UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 17: invalid start byte
- fortran使用MKL函数库求解普通稀疏矩阵与向量的乘积
- 第一天的学习内容---文件自动化处理
- ppt音频怎么保存下来?只需一个神操作,5秒钟搞定(gif图演示)
- JavaScript--Cookie
- mysql管理数据 并上传至云端_数据库MySQL可以实现云端存储_数据分析_数据管理_课课家...
- 基于Pytorch的机器学习Regression问题实例(附源码)