官方文档:
rowid :A globally unique address for a row in a database.
rowid用于确定数据库中唯一的行(包含数据库中的所有对象)
SQL> select rowid from test1 where rownum=1;
ROWID
------------------
AABbWOAABAAAcCaAAA
看到rowid是有64进制的18个字符组成的
A-Z代表0-25
a-z代表26-51
0-9代表52-61
+代表63
/代表64
其中18个字符分成4部分为:6字符+3字符+6字符+3字符
以上面的rowid为例子:
AABbWO AAB AAAcCa AAA
对象编号 相对文件号 数据块号 记录行号
记忆方法:从对象出发,一个对象可以跨多个数据文件,一个数据文件包含多个数据块,一个数据块有包含多行记录
上面说的通过sql就能看得见的rowid的现实方法,下面介绍一下rowid的存储方式:
rowid占10个字节即80个bit存储的,其中32位的对象号,10位的相对数据文件号,22位的数据块号,16位的记录编号
所以,一个数据库中最多可有4G个对象
每个数据库最多有1022个数据文件(2个为保留)
每个数据文件对多有4M个数据块
每个数据快最多有64k行记录
SQL> select rowid,substr(rowid,1,6) "object",substr(rowid,7,3) "file",substr(rowid,10,6) "block",substr(rowid,16,3) "row" from test1 where rownum<3;
ROWID object file block row
------------------ ------------ ------ ------------ ------
AABbWOAABAAAcCaAAA AABbWO AAB AAAcCa AAA
AABbWOAABAAAcCaAAB AABbWO AAB AAAcCa AAB
将64位显示的rowid转换为10进制的办法,是用oracle提供的dbms_rowid包
SQL> select dbms_rowid.rowid_object(rowid) object_id from test1 where rownum=1;
OBJECT_ID
----------
374158
SQL> select dbms_rowid.rowid_relative_fno(rowid) from test1 where rownum=1;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID)
------------------------------------
1
SQL> select dbms_rowid.rowid_block_number(rowid) from test1 where rownum=1;
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------
114842
SQL> select dbms_rowid.rowid_row_number(rowid) from test1 where rownum=1;
DBMS_ROWID.ROWID_ROW_NUMBER(ROWID)
----------------------------------
0
由上面的结果得到test1的对象号为374158,其中第一行记录存储在1号文件的第114842号block中,对应的行号是0。