oracle基礎知識之rowid學習

官方文檔:

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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章