The secret of ROWID
表里每个数据行都有一个行头部,在这里存放了该行数据所包含的列的数量,以及锁定标记等。当某个事务更新某条记录时,会在该数据行的头部记录所用到的ITL槽号以及锁定标记。接下来则是列长度以及列的值。Oracle在存放不同的列的时候,每个列之间没有空隙,都是紧密排列。同时,不同的数据行之间也是没有缝隙,紧密排列。因为在数据块的头部存在一个结构:行目录(row directory)。在行目录中,为每条数据行都记录了一个条目,每个条目就指向该记录的行头部。所以Oracle能够区分不同的行。
             对于每条记录来说都有个ROWID列,该ROWID是一个伪劣。也就是说,该列的值并没有实际的保存在数据块里,但是可以查询并显示出来。对于Oracle 10g来说,其ROWID格式为:OOOOOOFFFBBBBBBRRR. OOOOOO表示该数据行所在的对象号,FFF表示该数据行所在的相对文件号,BBBBBB表示该数据行所在的数据块号,RRR表示该行在数据块中的行号。ROWID采用64进制来表示,也就是A~Z,a~z,0~9,/,+ 这64个字符表示
ROWID。即:
 A~Z  ----> 0~25
 a~z  ----> 26~51
 0~9  ----> 52~61
 /    ----> 62
 +    ----> 63
 比如,我们看下面的例子:
conn hr/hr
SQL> create table student(student_id number,student_name varchar2(30)) tablespace users initrans 2 maxtrans 50;
Table created. 
 insert into student values(1,'watson');
 commit;
 SQL> select rowid ,student_id from student;
ROWID              STUDENT_ID
 ------------------ ----------
 AAACqLAAEAAAWsSAAA          1
可以看到,插入的记录的rowid 为【AAACqL】【AAE】【AAAWsS】【AAA】。我们可以做如下的计算:
AAACqL表示对象号。 A对应0,C对应2,q对应42,L对应11,于是我们有:
 0+0+0+2*power(64,2)+42*power(64,1)+11*power(64,0)=10891
 说明student表对应的对象号为10891.我们可以验证下该对象号:
 SQL> select object_id from user_objects where lower(object_name)='student';
OBJECT_ID
 ----------
      10891
AAE表示文件号。E对应4.于是我们有:
 0+0+4*power(64,0)=4
 说明这条记录所在的文件号为4.我们可以借助dbms_rowid包来验证:
 SQL> select dbms_rowid.rowid_relative_fno('AAACqLAAEAAAWsSAAA') as file_no from dual;
FILE_NO
 ----------
          4
AAAWsS 表示数据块号。A对应0,W对应22. s对应44,S对应18于是我们有:
 0+0+0+22*power(64,2)+44*power(64,1)+18*power(64,0)=92946
 说明该记录所在的快号为92946.我们同样可以借助dbms_rowid包来验证:
 SQL> select dbms_rowid.rowid_block_number('AAACqLAAEAAAWsSAAA') as block_no from dual;
BLOCK_NO
 ----------
      92946
最后,AAA表示该行的行号。于是我们有:
 0+0+0*power(64,0)=0
 说明该记录所在的行号为0,也就是第一行记录。我们借助dbms_rowid包来验证:
 SQL> select dbms_rowid.rowid_row_number('AAACqLAAEAAAWsSAAA') as row_no from dual;
ROW_NO
 ----------
          0
The secret of ROWID的更多相关文章
- 使用rowid抽取数据方法以及大数据量游标卡住的应对
		
平时工作的时候,经常会遇到这种事情,从一个大表A中,抽取字段a在一个相对较小B的表的数据,比如,从一个详单表中,抽取几万个用户号码的话单出来.这种时候,一般来说, 做关联查询: create tabl ...
 - Android Secret Code
		
我们很多人应该都做过这样的操作,打开拨号键盘输入*#*#4636#*#*等字符就会弹出一个界面显示手机相关的一些信息,这个功能在Android中被称为android secret code,除了这些系 ...
 - ASP.NET OAuth:access token的加密解密,client secret与refresh token的生成
		
在 ASP.NET OWIN OAuth(Microsoft.Owin.Security.OAuth)中,access token 的默认加密方法是: 1) System.Security.Crypt ...
 - 【转】oracle中rowid的用法 (全面)
		
ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置. ROWID可以分为物理rowid和逻辑rowid两种.普通的堆表中的rowid是物理rowid,索引组织表 ...
 - rownum和rowid伪列
		
select row employee_id,last name,salary from employees; select row employee_id,last name,salary from ...
 - TOAD和PLSQL 默认日期显示、rowid显示、TNSNAME的修改
		
先说下要解决的问题: select rowid,acct_id,state_date from acct; 修改后,1)sql指明rowid,可以显示出来 2)时间格式显示为YYYYMMDD HH24 ...
 - ROWID伪列
		
ROWID伪列概念: 在数据表中每一行所保存的记录,oracle会为每条记录分配一个唯一的地址编号,这个编号就是通过ROWID表示的. 所有的数据都利用ROWID进行定位. 观察rowid的存在 SQ ...
 - Lucky 2048 - The secret of being lucky
		
Lucky 2048 uses a normal distribution to create "lucky" start. Generally speaking, it prov ...
 - Oracle中rownum和rowid的理解(转)
		
本文转自地址http://www.linuxidc.com/Linux/2012-04/58300.htm rownum,rowid都叫伪列. 但是,rownum是逻辑上的编号,且其值总是从1开始,每 ...
 
随机推荐
- Qt 格式化字符串
			
Qt字符串格式化性能比较 Qt字符串格式方法有三种, QString::arg(), QString::sprinft()和QStringList::join().今天我做了个简单的性能测试, 希望对 ...
 - C#委托的回调机制
			
代码如下: public partial class FrmMain : Form { // 定义回调使用关键字 delegate(回调是委托的一种应用,其本质就是委托) private delega ...
 - Lambda 笔记
			
lambda表达式,将会带来代码的灵活性,同时使我们的代码更具表现力. Dim doubleIt As Func(Of Integer, Integer) = _ Function(x As Inte ...
 - C#、.NET和ASP.NET三者之间的区别
			
刚毕业后出去找工作面试的时候就遇到这个问题!.回答不上来.回来网上查的如下: 那么 .NET.C#和ASP.NET这三者之间区别不清楚,到底它们之间有什么联系呢? 1..NET是一个平台,一个抽象的平 ...
 - C#高级编程第1章-.NET体系结构
			
内容提要: (1)编译和运行面向对象.NET代码 (2)IL/MSIL(Microsoft Intermediate Language)中间语言的优点 (3)值类型与引用类型 (4)数据类型化 (5) ...
 - JQuery中常用的        属性选择器
			
jQuery中使用$()作为选择符极大提高工作效率以及方便快捷;一些常用属性的选择器由以下几种 1) $('#id') id选择器 2) $('.class') css选择器,class类名 3) $ ...
 - js操作符
			
JS操作符 x + y(数字) 将x和y相加; x + y(字符串) 将x和y拼接在一起; x - y 从x中减去y; x * y 将x和y相乘; x / y 将x除以y; x % y x和y的模(既 ...
 - 最全C语言笔记回顾
 - PullToRefresh的使用
			
主界面↓ package com.wangzhen.pulltorefresh; import java.util.ArrayList; import java.util.List; import c ...
 - java优势
			
跨平台,只要有JVM(Java虚拟机)的操作系统就可以运行JAVA程序: 安全: 弃用危险的指针: 自动内在管理机制,垃圾回收机制,由垃圾回收器回收,减轻程序负担,也避免了手动回收的危险性: 完全面向 ...