Oracle rowid

Rowid简介

Rowid 是表的伪列,它用于惟一标识表行,并且间接给出了表行的物理位置,是定位表行最快的方式,使用insert语句插入数据时,oracle会自动生成rowid并将其值与表数据一起存放到表行中,oracle提供了扩展rowidoracle 8及以后)和受限rowid8i以前)两种rowid类型,
8i以前rowidfile#+block#+row#组成,占用6bytes的空间,10 bit file# 22 bit block# 16 bit row#(如下图)
由上图可以看到,数据文件地址有32bit,其中file#10bitblock#22bit
由于不存在0编号文件所以理论上一个数据库最大文件数为2^10-1=1023
而一个文件可以有包含2^22blocks
如果db_block_size4kdatafile max size就是2^22*4k =16G
如果db_block_size8kdatafile max size就是2^22*8k =32G
oracle 8开始rowid变成了extend rowid,由data_object_id#+rfile#+block#+row#组成,占用10bytes的空间
由于rowid的组成从file#变成了rfile#,所以数据文件数的限制也从整个库不能超过1023个变成了每个data_object_id不能超过1023个数据文件

查看rowid(本文讨论oracle10g)

rowid 10个字节的存储空间,显示结果为18个字符, 1-6(object_id#), 7-9(rfile#), 10-15(block#), 16-18(row#),可以使用dbms_rowid函数把它们都调出来.如下:
SQL> select rowid ,
dbms_rowid.rowid_object(rowid) obj_id# ,
dbms_rowid.rowid_relative_fno(rowid) rfile# ,
dbms_rowid.rowid_block_number(rowid) block# ,
dbms_rowid.rowid_row_number(rowid) row#
from t
where rownum < 10;
 
ROWID                        OBJ_ID#     RFILE#    BLOCK#     ROW#
---------------------------------- -----------------
AAAHwuAABAAALmaAAA      31790          1      47514          0
AAAHwuAABAAALmaAAB      31790          1      47514          1
AAAHwuAABAAALmaAAC      31790          1      47514          2
AAAHwuAABAAALmaAAD      31790          1      47514          3
AAAHwuAABAAALmaAAE      31790          1      47514          4
AAAHwuAABAAALmaAAF      31790          1      47514          5
AAAHwuAABAAALmaAAG      31790          1      47514          6
AAAHwuAABAAALmaAAH      31790          1      47514          7
AAAHwuAABAAALmaAAI      31790           1      47514          8
 
简单使用
由于rowid惟一标识表行,并且间接给出了表行的物理位置,所以当我们查出block#后可以查到此行数据存放的具体位置
由上面的查询结果可以看到前9行记录的block#都为47514,这些block#所在的rfile#都为1,当知道rfile#就可以使用dba_data_files表查看它的具体位置.
查看dba_data_files表结构
SQL> desc dba_data_files
 Name                                      Null?    Type
 -------------------------- ----------------------------
 FILE_NAME                                          VARCHAR2(513)
 FILE_ID                                                NUMBER
 TABLESPACE_NAME                              VARCHAR2(30)
 BYTES                                                 NUMBER
 BLOCKS                                              NUMBER
 STATUS                                               VARCHAR2(9)
 RELATIVE_FNO                                      NUMBER
 AUTOEXTENSIBLE                                 VARCHAR2(3)
 MAXBYTES                                           NUMBER
 MAXBLOCKS                                        NUMBER
 INCREMENT_BY                                     NUMBER
 USER_BYTES                                        NUMBER
 USER_BLOCKS                                     NUMBER
查看数据file_id=1的物理位置
SQL> col file_name format a50
SQL> select file_name,file_id from dba_data_files where file_id=1;
 
FILE_NAME                                                 FILE_ID
------------------------------------ --------------
/u01/oradata/denver/system01.dbf             1
可见此行数据保存在/u01/oradata/denver/system01.dbf数据文件中.