zoukankan      html  css  js  c++  java
  • rowid

    版本

    首先,我们所讨论的内容是基于以下oracle 版本

    SQL> select * from v$version;
    
    BANNER
    ------------------------------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
    PL/SQL Release 10.2.0.5.0 - Production
    CORE    10.2.0.5.0      Production
    TNS for Solaris: Version 10.2.0.5.0 - Production
    NLSRTL Version 10.2.0.5.0 - Production
    View Code

    rowid 是什么

    rowid是oracle里面标示row的一种数据结构。每一个表其实都有一个pseduocolumn,叫rowid,通过这个pseduocolumn你就可以查到每一行数据的rowid,如下:

    SQL> desc citosadmin.test
     Name                                        Null?    Type
     ------------------------------------------- -------- ------------------------------
     ID1                                                  NUMBER
     ID2                                                  NUMBER
     TEXT                                                 VARCHAR2(2000)
    
    SQL> select id1,id2,text,rowid from citosadmin.test;
    
           ID1        ID2 TEXT     ROWID
    ---------- ---------- -------- ------------------
             1          1 a        AAA86xAAEAAAPAlAAA
             2          2 b        AAA86xAAEAAAPAlAAB
             3          3 c        AAA86xAAEAAAPAlAAC
    View Code

    rowid的种类

    rowid其实有两种,或者说rowid pseduocolumn这个列有两种数据类型,一种就是rowid,一种是urowid。前一种就是我们普通的rowid,所有普通的表的rowid都是这种类型。后一种urowid叫universal rowid,对应着一些特殊的表,比如index organized table,或者外部表。我们只看普通的rowid。

    普通的rowid其实还分为restricted rowid和extended rowid。restricted rowid是oracle 8i之前用的,里面存储的信息包括file number,data block number 和slot。slot是row在data block中的位置。通过这些信息oracle可以迅速定位一个row。extended rowid是oracle 8i开始使用的,因为oracle 8i开始 file number有了两种形式,一种叫绝对的file number,一种叫相对的file number。绝对的file number可以从数据库层面唯一标示一个file而相对的file number只能是在一个表空间内部标示一个file。oracle 8i开始后,在rowid里面存储的信息是相对file number,相对的file number 没办法从数据库层面迅速的定位一个file,所以 8i的rowid又引进一个内容,叫dba_objects.data_object_id(注意和dba_objects.object_id有区别)。通过这个值可以定位一个表空间,进而通过相对相对file number就可以定位到文件。

    rowid的结构如下:

    struct riddef {
        ub4    ridobjnum; /* data obj#--this field is 
                             unused in restricted ROWIDs */
        ub2    ridfilenum;
        ub1    filler;
        ub4    ridblocknum;
        ub2    ridslotnum;
    }
    

    在restricted rowid中ub4是预留位置,赋值为空。而ub2存储的是绝对的file number。 extended rowid是使用ub4来存储data object id,而ub2存储的是相对 file number。一个要注意的问题是,我们这里提到了data object id ,它在dba_objects中由data_object_id这一列显示,它和object_id是不同的。object_id是标示数据对象的,比如表,而data object id是标示segment的。假如一个表是分区表,那么这个表只有一个object_id但是可以有很多data object id。

    dbms_rowid的应用

    dbms_rowid是oracle提供的一个pl/sql package。 包含了许多function 和 procedure。下面列出了这些function 和 procedure。 我们知道rowid 会包含relative file number, block number , data object id , slot这些信息。但是直接显示的rowid是一长串数字很难读懂。通过这些function 我们可以轻易的得到其中隐藏的block number, relative file number等信息。

    ROWID_BLOCK_NUMBER Function

    Returns the block number of a ROWID

    ROWID_CREATE Function

    Creates a ROWID, for testing only

    ROWID_INFO Procedure

    Returns the type and components of a ROWID

    ROWID_OBJECT Function

    Returns the object number of the extended ROWID

    ROWID_RELATIVE_FNO Function

    Returns the file number of a ROWID

    ROWID_ROW_NUMBER Function

    Returns the row number

    ROWID_TO_ABSOLUTE_FNO Function

    Returns the absolute file number associated with the ROWID for a row in a specific table

    ROWID_TO_EXTENDED Function

    Converts a ROWID from restricted format to extended

    ROWID_TO_RESTRICTED Function

    Converts an extended ROWID to restricted format

    ROWID_TYPE Function

    Returns the ROWID type: 0 is restricted, 1 is extended

    ROWID_VERIFY Function

    Checks if a ROWID can be correctly extended by the ROWID_TO_EXTENDED function

    具体的使用可以参考

    http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_rowid.htm#ARPLS053

  • 相关阅读:
    21--数据库优化
    20--mysql读写分离,分库分表
    18--mysql主从复制、及架构
    17--数据快速导出、导入,数据库迁移
    16--mysql数据备份
    15--mysql日志管理
    14--mysql锁机制
    13--mysql事务详解,数据库读现象
    etcd原理详解代码剖析
    k8s入坑之路(10)kubernetes coredns详解
  • 原文地址:https://www.cnblogs.com/kramer/p/3807712.html
Copyright © 2011-2022 走看看