Rowid 是表的伪列,它用于惟一标识表行,并且间接给出了表行的物理位置,是定位表行最快的方式,使用insert语句插入数据时,oracle会自动生成rowid并将其值与表数据一起存放到表行中,oracle提供了扩展rowid(oracle 8及以后)和受限rowid(8i以前)两种rowid类型,
在8i以前rowid由file#+block#+row#组成,占用6个bytes的空间,10 bit 的 file# ,22 bit 的 block# ,16 bit 的 row#(如下图)
由上图可以看到,数据文件地址有32bit,其中file#有10bit,block#有22bit
由于不存在0编号文件所以理论上一个数据库最大文件数为2^10-1=1023
而一个文件可以有包含2^22个blocks
如果db_block_size为4k的datafile max size就是2^22*4k =16G
如果db_block_size为8k的datafile max size就是2^22*8k =32G
从oracle 8开始rowid变成了extend rowid,由data_object_id#+rfile#+block#+row#组成,占用10个bytes的空间
由于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数据文件中.
本文转自 vfast_chenxy 51CTO博客,原文链接:http://blog.51cto.com/chenxy/168646,如需转载请自行联系原作者