zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    处理视频流时可能出现的重复帧问题及解决办法
    shell脚本中cd命令无效
    C++教程之初识编程
    若干排序算法的Python实现方法及原理
    C/C++反三角函数使用注意
    ubuntu下安装pip install mysqlclient 报错 command "python setup.py egg_info" failed with error.....解决方案
    使用scrapy框架的monkey出现monkeypatchwarning: monkey-patching ssl after ssl...的解决办法
    机器学习之利用KNN近邻算法预测数据
    python数据分析的工具环境
    python代码实现经典排序算法
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3172125.html
Copyright © 2011-2022 走看看