[Oracle]使用DBMS_ROWID定位数据块的物理位置

来源:互联网 发布:淘宝比较冷门的类目 编辑:程序博客网 时间:2024/06/05 18:46

     对于Oracle中的堆表来说,每一行数据都会存在一个伪列(这一列在数据库中不是真实存在的,只是为了定位,Oracle自己创建的)。根据这个伪列rowid,能够用dbms_rowid这个数据包来定位数据块的物理位置。

    Rowid_block_number:  返回rowid的所在块的位置;    

    Rowid_relative_fno: 返回rowid的所在的文件号;

    Rowid_row_number: 返回rowid的所在块中的行数;


HR@ORCL>desc test

 Name                                      Null?    Type

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

 ID                                                 NUMBER

 NAME                                               VARCHAR2(20)

 

HR@ORCL>select rowid,dbms_rowid.rowid_relative_fno(rowid) "fno",

       2 dbms_rowid.rowid_block_number(rowid) "blockno", dbms_rowid.rowid_row_number(rowid) "rowno" 

       3 from hr.test;

 

ROWID                                          fno    blockno      rowno

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

AAACglAAEAAATgbAAA          4      79899          0

AAACglAAEAAATgbAAB          4      79899          1

AAACglAAEAAATgbAAC          4      79899          2

AAACglAAEAAATgbAAD          4      79899          3

AAACglAAEAAATgbAAE          4      79899          4

AAACglAAEAAATgbAAF          4      79899          5

 

6 rows selected.

 

SYS@ORCL>select FILE#,NAME,BLOCKS from v$datafile;

     FILE# NAME

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

         1 /u01/app/oracle/oradata/PROD/disk1/system01.dbf

         2 /u01/app/oracle/oradata/PROD/disk1/undotbs01.dbf

         3 /u01/app/oracle/oradata/PROD/disk1/sysaux01.dbf

         4 /u01/app/oracle/oradata/PROD/disk3/example.dbf

         5 /u01/app/oracle/oradata/PROD/disk4/USERS.dbf


 

根据dbms_rowid包查出的信息,rowidAAACglAAEAAATgbAAA的数据是在4号文件中的79899号块的第0行。可以在v$datafile这个动态视图中查找到文件号与文件物理位置的对应关系。

0 0
原创粉丝点击