Oracle rowid

Oracle 使用 rowid 来定位数据库中的一条记录(行). 

rowid 一共 18 位, 是一个基于 64 进制的物理地址, 每个字符的取值为 A-Z, a-z, 0-9, + 和 /

SQL> select rowid, dept.* from dept where deptno = 10;

ROWID                  DEPTNO DNAME          LOC
------------------ ---------- -------------- -------------
AAATgAAAFAAAACHAAA         10 ACCOUNTING     NEW YORK

AAATgA ---   data object number对象号 (占 6 个字符) 

AAF ---   relative file number 文件号 (占 3 个字符) 

AAAACH ---   block number 块号 (占 6 个字符)

AAA      ---   row number 行号   (占 3 个字符)


使用 dbms_rowid 包获取 object number, file number, block number, row number

SQL> select dbms_rowid.rowid_object(rowid) object_id,
  2  dbms_rowid.rowid_relative_fno(rowid) file_id,
  3  dbms_rowid.rowid_block_number(rowid) block_id,
  4  dbms_rowid.rowid_row_number(rowid) num
  5  from dept
  6  where deptno = 10;


 OBJECT_ID    FILE_ID   BLOCK_ID        NUM
---------- ---------- ---------- ----------
     79872          5        135          0


SQL> select object_name from dba_objects where object_id = 79872;


OBJECT_NAME
------------------------------
DEPT


SQL> select file_name from dba_data_files where file_id = 5;


FILE_NAME
------------------------------------------------------------------------


G:\APP\DAVIDD\PRODUCT\11.2.0\DBHOME_1\ORADATA\SCOTT_TBS01.DBF

当一条记录被赋予一个 rowid 后, rowid 只有在特殊的情况下才会改动. 例如 flashback table 操作, 表压缩操作, row 移动操作, 以及 row 导入导出操作等等

SQL> select rowid,
  2  deptno,
  3  dbms_rowid.rowid_object(rowid) object_id,
  4  dbms_rowid.rowid_relative_fno(rowid) file_id,
  5  dbms_rowid.rowid_block_number(rowid) block_id,
  6  dbms_rowid.rowid_row_number(rowid) num
  7  from dept;


ROWID                  DEPTNO  OBJECT_ID    FILE_ID   BLOCK_ID        NUM
------------------ ---------- ---------- ---------- ---------- ----------
AAATgAAAFAAAACHAAA         10      79872          5        135          0
AAATgAAAFAAAACHAAB         20      79872          5        135          1
AAATgAAAFAAAACHAAC         30      79872          5        135          2
AAATgAAAFAAAACHAAD         40      79872          5        135          3


SQL> alter table dept move pctfree 15;


Table altered.


SQL> select rowid,
  2  deptno,
  3  dbms_rowid.rowid_object(rowid) object_id,
  4  dbms_rowid.rowid_relative_fno(rowid) file_id,
  5  dbms_rowid.rowid_block_number(rowid) block_id,
  6  dbms_rowid.rowid_row_number(rowid) num
  7  from dept;


ROWID                  DEPTNO  OBJECT_ID    FILE_ID   BLOCK_ID        NUM
------------------ ---------- ---------- ---------- ---------- ----------
AAATmKAAFAAAACbAAA         10      80271          5        155          0
AAATmKAAFAAAACbAAB         20      80271          5        155          1
AAATmKAAFAAAACbAAC         30      80271          5        155          2
AAATmKAAFAAAACbAAD         40      80271          5        155          3
在这里我们可以看出 table move 后, 不仅 rowid 发生了变化, object_id (对象名) 值也发生了变化. 
SQL> col object_name for a30
SQL> select object_name, object_id, data_object_id from dba_objects where object
_id = 79872;


OBJECT_NAME                     OBJECT_ID DATA_OBJECT_ID
------------------------------ ---------- --------------
DEPT                                79872          80271

补充说明: 

dba_objects 中 object_id: Object number of the object
data_object_id: Object number of the segment which contains the object

对于 table 来说, object_id 和 data_object_id 大部分情况下是相等的, 但是如果 table 发生 move, shrink, truncate 情况时, 会重新分配 data segment, 这时 data_object_id 会指向新的 data segment.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值