oracle rowid学习

本文深入解析Oracle Rowid的概念、作用、类型及其在数据存储中的应用,包括如何通过Rowid查询数据文件物理位置,以及如何使用DBMS_ROWID函数获取Rowid各组成部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

本文出自 “追求” 博客,请务必保留此出处http://chenxy.blog.51cto.com/729966/168646

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值