【ROWID】Oracle rowid说明

ROWID一些说明

  • rowid一般是由18位组成,如000000FFFBBBBBBRRR,0是对象的ID,F是文件的ID,B是块的id,R是行的id
  • rowid为一行的物理地址,当一行数据插入数据块后,rowid是为疑似的,除非有物理移动(如move),否则不变。
  • rowid 不真正的存储在表数据块中,如果有索引就会存在索引中,方便根据索引中的rowid找到表数据

示例如下:

--创建一张表,查询第一个rowid
SQL> create table t as select * from all_objects;
Table created.
SQL> select rowid from t where rownum<=1;
ROWID
------------------
AAAnn1AAJAAAiRbAAA
--查看该rowid的信息
SQL> select dbms_rowid.rowid_object('AAAnn1AAJAAAiRbAAA') data_object_id from dual;
DATA_OBJECT_ID
--------------
    162293
SQL> select dbms_rowid.rowid_relative_fno('AAAnn1AAJAAAiRbAAA') rfile from dual; 
     RFILE
----------
     9
SQL> select dbms_rowid.rowid_block_number('AAAnn1AAJAAAiRbAAA')  block from dual;
     BLOCK
----------
    140379
SQL> select dbms_rowid.rowid_row_number('AAAnn1AAJAAAiRbAAA') o_row from dual;
     O_ROW
----------
     0
--根据rowid信息查看相关信息
SQL> select owner,object_name from dba_objects where object_id=162293;
OWNER                   OBJECT_NAME
------------------------------ --------------------
MYTEST                   T
FILE_NAME                             TABLESPACE_NAME
------------------------------------------------------------ --------------------
+DATA/mydb/datafile/mytest.270.1025380271             MYTEST
SQL> 1
  1* select file_name,tablespace_name from dba_data_files where file_id=9
SQL>

Rowid 值有几个重要的用途:

  • 它们是访问单行的最快方式。
  • 它们可以向您展示表中的行是如何存储的。
  • 它们是表中行的唯一标识符。

尽管ROWID在查询的SELECT and WHERE子句中使用伪列,但这些伪列值实际上并未存储在数据库中。索引不能插入、更新或删除ROWID伪列的值。

参考

请使用浏览器的分享功能分享到微信等