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伪列的值。