oracle rowid学习

 

Oracle rowid

Rowid简介

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 数据文件中 .

你可能感兴趣的:(oracle,学习)