zoukankan      html  css  js  c++  java
  • Oracle中ROWID详解

      oracle数据库的表中的每一行数据都有一个唯一的标识符,或者称为rowid,在oracle内部通常就是使用它来访问数据的。rowid需要 10个字节的存储空间,并用18个字符来显示。该值表明了该行在oracle数据库中的物理具体位置。可以在一个查询中使用rowid来表明查询结果中包含该值。

          保存rowid需要10个字节或者是80个位二进制位。这80个二进制位分别是:
          1. 数据对象编号,表明此行所属的数据库对象的编号,每个数据对象在数据库建立的时候都被唯一分配一个编号,并且此编号唯一。数据对象编号占用大约32位。
          2. 对应文件编号,表明该行所在文件的编号,表空间的每一个文件标号都是唯一的。文件编号所占用的位置是10位。
          3. 块编号,表明改行所在文件的块的位置块编号需要22位。
          4. 行编号,表明该行在行目录中的具体位置行编号需要16位。
    这样加起来就是80位。

    Oracle的物理扩展ROWID有18位,每位采用64位编码,分别用A~Z、a~z、0~9、+、/共64个字符表示。A表示0,B表示1,……Z表示25,a表示26,……z表示51,0表示52,……,9表示61,+表示62,/表示63。

    例如:

    select rowid,empid from scott.emp;

    将会得到结果:

     select rowid,empno from scott.emp;

    ROWID EMPNO

    ------------------ ----------

    AAAR3sAAEAAAACXAAA 7369

    AAAR3sAAEAAAACXAAB 7499

    AAAR3sAAEAAAACXAAC 7521

    AAAR3sAAEAAAACXAAD 7566

    AAAR3sAAEAAAACXAAE 7654

    AAAR3sAAEAAAACXAAF 7698

    AAAR3sAAEAAAACXAAG 7782

    AAAR3sAAEAAAACXAAH 7788

    AAAR3sAAEAAAACXAAI 7839

    AAAR3sAAEAAAACXAAJ 7844

    AAAR3sAAEAAAACXAAK 7876

    AAAR3sAAEAAAACXAAL 7900

    AAAR3sAAEAAAACXAAM 7902

    AAAR3sAAEAAAACXAAN 7934

    已选择14行。

    这里的AAAR3s是数据库对象编号,AAE是文件标号,AAAACX是块编号,最后三位(empno = 7934时为AAN)是行编号。

    据下面的查询结果:

    SQL> select FILE_ID as fid,FILE_NAME  from dba_data_files where TABLESPACE_NAME='USERS' ;

           FID FILE_NAME

    ---------- ---------------------------------------------

    4 D:APPWANGXUWEIORADATAORCLUSERS01.DBF

     我们可看出FILE_ID=4,就是ROWID中AAE。

     通过dbms_rowid包,可以直接得到具体的rowid包含的信息:

    SQL> select dbms_rowid.rowid_object(rowid) object_id,dbms_rowid.rowid_relative_fno(rowid) file_id,dbms_rowid.rowid_block_number(rowid) block_id,dbms_rowid.rowid_row_number(rowid) row_number from emp;

     OBJECT_ID    FILE_ID BLOCK_ID ROW_NUMBER

    ---------- ---------- ---------- ----------

         73196    4     151  0

         73196    4     151  1

         73196    4     151  2

         73196    4     151  3

         73196    4     151  4

         73196    4     151  5

         73196    4     151  6

         73196    4     151  7

         73196    4     151  8

         73196    4     151  9

         73196    4     151 10

     OBJECT_ID    FILE_ID BLOCK_ID ROW_NUMBER

    ---------- ---------- ---------- ----------

         73196    4     151 11

         73196    4     151 12

         73196    4     151 13

    已选择14行。

    我们可验算如下:73196=AAAR3s=17×64×64+55×64+44 

                                151=AAAACX=2×64+23
    最后一条记录编号AAN =13

    通过dbms_rowid包,还可以查询到表或记录所在的文件
    SQL> select file_name, file_id from dba_data_files where file_id in  (select distinct dbms_rowid.rowid_relative_fno(rowid) from scott.emp);

    FILE_NAME FILE_ID
    --------------------------------------------- ----------
    D:APPWANGXUWEIORADATAORCLUSERS01.DBF                      4

    使用describle(或简写为desc)命令查看表结构时,输出结果中是不能看到rowid这里一列的,这是因为这一列只在数据库内部使用,rowid通常被称为一个伪列。在某些oracle数据库操作的IDE(例如golden)中使用这些工具自带的数据编辑功能时,必须指定rowid列才能完成,例如如果想选择

    scott.emp的数据后进行手工修改,则必须使
    select rowid,t.* from scott.emp t;
    而不能直接写成
    select * from emp;

    原文链接:https://blog.csdn.net/wxwpxh/article/details/50532464

  • 相关阅读:
    ASP.NET -- repeater控件的使用
    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40
    错误提示:在此上下文中不允许使用名称 "***"。有效表达式包括常量、 常量表达式和变量(在某些上下文中),不允许使用列名。
    mongodb 性能提高之利用索引, 待续
    工程化 经历的 4 个阶段
    把连续的字符 变成 一个
    sort 排序详解
    理解正则 的 ?! ?:
    [ 订单查询 ] 性能 高并发 : 分表 与 用户id%1024 存放表
    搭建LNMP基础框架
  • 原文地址:https://www.cnblogs.com/yrjns/p/11083251.html
Copyright © 2011-2022 走看看