表里每个数据行都有一个行头部,在这里存放了该行数据所包含的列的数量,以及锁定标记等。当某个事务更新某条记录时,会在该数据行的头部记录所用到的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的更多相关文章

  1. 使用rowid抽取数据方法以及大数据量游标卡住的应对

    平时工作的时候,经常会遇到这种事情,从一个大表A中,抽取字段a在一个相对较小B的表的数据,比如,从一个详单表中,抽取几万个用户号码的话单出来.这种时候,一般来说, 做关联查询: create tabl ...

  2. Android Secret Code

    我们很多人应该都做过这样的操作,打开拨号键盘输入*#*#4636#*#*等字符就会弹出一个界面显示手机相关的一些信息,这个功能在Android中被称为android secret code,除了这些系 ...

  3. ASP.NET OAuth:access token的加密解密,client secret与refresh token的生成

    在 ASP.NET OWIN OAuth(Microsoft.Owin.Security.OAuth)中,access token 的默认加密方法是: 1) System.Security.Crypt ...

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

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

  5. rownum和rowid伪列

    select row employee_id,last name,salary from employees; select row employee_id,last name,salary from ...

  6. TOAD和PLSQL 默认日期显示、rowid显示、TNSNAME的修改

    先说下要解决的问题: select rowid,acct_id,state_date from acct; 修改后,1)sql指明rowid,可以显示出来 2)时间格式显示为YYYYMMDD HH24 ...

  7. ROWID伪列

    ROWID伪列概念: 在数据表中每一行所保存的记录,oracle会为每条记录分配一个唯一的地址编号,这个编号就是通过ROWID表示的. 所有的数据都利用ROWID进行定位. 观察rowid的存在 SQ ...

  8. Lucky 2048 - The secret of being lucky

    Lucky 2048 uses a normal distribution to create "lucky" start. Generally speaking, it prov ...

  9. Oracle中rownum和rowid的理解(转)

    本文转自地址http://www.linuxidc.com/Linux/2012-04/58300.htm rownum,rowid都叫伪列. 但是,rownum是逻辑上的编号,且其值总是从1开始,每 ...

随机推荐

  1. UVA10765-Doves and bombs(BCC)

    option=com_onlinejudge&Itemid=8&page=show_problem&problem=1706">题目链接 题意:给定一个n个点的 ...

  2. [ES6] Function Params

    1. Default Value of function param: The function displayTopicsPreview() raises an error on the very ...

  3. 简析MFC中CString用作C字符串

      MFC中CString是一个方便的字符串操作的类, 然而很多函数需要传递字符指针, 这就需要进行CString和普通字符串的转换. 1.CString用作C字符串常量. 直接使用强制类型转换即可, ...

  4. .NET基础拾遗(7)多线程开发基础3

    一.如何使用异步模式? 异步模式是在处理流类型时经常采用的一种方式,其应用的领域相当广阔,包括读写文件.网络传输.读写数据库,甚至可以采用异步模式来做任何计算工作.相对于手动编写线程代码,异步模式是一 ...

  5. python自动化执行脚本

    ---恢复内容开始--- 1 (1)首先在你的.py文件上加上一行代码注释: #!/usr/local/bin/python2.7 (2)终端下执行: crontab -e 进入后,输入i 进入可编辑 ...

  6. Jquery 使用JSOPN实例

    1.说明 dataType:返回的数据类型 jsonp:传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback) jsonpCallback:自定义的jsonp ...

  7. 数据库元数据分析Demo

    核心类:DatabaseMetaData.ResultSetMetaData 1 System.err.println("********************************** ...

  8. MySql用statement实现DDL,DML,DQL的操作Demo

    Demo1 Connection connection=null; Statement stmt=null; int result=-1; try { Class.forName("com. ...

  9. uva 10107 - What is the Median?

    #include <cstdio> #include <iostream> using namespace std; ]; int main() { int i, cur_in ...

  10. javascript中的substr和substring

    1.substr 方法 返回一个从指定位置开始的指定长度的子字符串. stringvar.substr(start [, length ]) 参数: stringvar 必选项.  要提取子字符串的字 ...