官方文檔:
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。