Oracle資料庫開發——瞭解rowid

呆呆笨笨的魚發表於2014-04-28
關於rowid,這個偽列具體有什麼作用呢?

rowid是一個64進位制數,一共18位,
其中前6表示資料段的編號,接下來的3位表示相對檔案編號,再下來的6位是塊編號,最後3位是相對塊的行編號。

即:
OOOOOO(Data Object Number) FFF(relative file number相對錶空間的檔案編號) BBBBBB(Block Number) RRR(Row number)

注意:相對檔案編號和絕對檔案編號的區別
SQL> select t.FILE_ID,t.RELATIVE_FNO from dba_data_files t; 
 
   FILE_ID RELATIVE_FNO
---------- ------------
         1            1
         2            2
         3            3
         4            4
         5            5
         6            6
         7            7
         8            8
 
其中 FILE_ID 絕對檔案編號,RELATIVE_FNO 相對檔案編號
當資料庫裡面的資料檔案小於等於1022的時候,絕對檔案編號 和 相對檔案編號相等。


這64進位制是怎麼樣來表示的:
A~Z 表示 0到25
a~z 表示 26到51
0~9 表示 52到61
+  表示 62
/  表示 63

這樣0~63就全了~

來驗證下:
SQL> select rowid,g.* from goods g;
 
ROWID                                                 G_ID G_NAME          G_PRICE G_LEVELS
------------------ --------------------------------------- ---------- ------------ ----------
AAADtcAAEAAAACnAAA                                       1 LoL               88.00 低價


可以看到該條資料:
AAADtc(資料段編號)AAE(相對檔案編號) AAAACn(塊編號)  AAA(塊中行號)


SQL> select OWNER,OBJECT_NAME,OBJECT_ID,DATA_OBJECT_ID from dba_objects where owner = 'ZHANGBIN' and object_name ='GOODS';
 
OWNER                          OBJECT_NAME            OBJECT_ID DATA_OBJECT_ID
------------------------------ --------------------- ---------- --------------
ZHANGBIN                       GOODS                      15196          15196


可以看到表goods表的資料段編號為 15196


計算一下: AAADtc =? 15196

SQL> select 0*power(64,5)+0*power(64,4)+0*power(64,3)+3*power(64,2)+45*64+28 from dual;
 
0*POWER(64,5)+0*POWER(64,4)+0*
------------------------------
                         15196

結果是相等的


同理可以計算出
 
AAE(相對檔案編號)=4   
AAAACn(塊編號)= 2*64 + 39 = 167  
AAA(塊中行號)= 0

那麼,這說明goods表中的這行資料,應該在4號檔案的第167個塊上?驗證一下。

SQL> select * from dba_extents where owner = 'ZHANGBIN' and segment_name = 'GOODS';

OWNER     SEGMENT_NAME  PARTITION_NAME  SEGMENT_TYPE TABLESPACE_NAME  EXTENT_ID    FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO
--------- ------------- --------------- ------------ --------------- ---------- ---------- ---------- ---------- ---------- ------------
ZHANGBIN  GOODS                         TABLE        USERS                    0          4        160      65536          8            4


可以看到 FILE_ID = 4,BLOCK_ID = 160,BLOCKS = 8
說明 4號檔案,從第160塊開始,連續8個塊屬於表GOODS的資料段,即塊號位160 ~ 167屬於GOODS的資料段


我們計算出來的塊是167,即驗證了goods表中這行資料,應該在4號檔案的第167個塊上
又由於AAA(塊中行號)= 0,該條資料存在 4號檔案的第167個塊上的第一行 !


以上是我們自己手工來裝換計算
=====================================================================
Oracle中提供了計算rowid相關值的包 dbms_rowid


SQL> select
  2         dbms_rowid.rowid_object('AAADtcAAEAAAACnAAA') as data_object_id
  3        ,dbms_rowid.rowid_relative_fno('AAADtcAAEAAAACnAAA') as relative_fno
  4        ,dbms_rowid.rowid_block_number('AAADtcAAEAAAACnAAA') as block_number
  5        ,dbms_rowid.rowid_row_number('AAADtcAAEAAAACnAAA') as row_number
  6  from dual;
 
DATA_OBJECT_ID RELATIVE_FNO BLOCK_NUMBER ROW_NUMBER
-------------- ------------ ------------ ----------
         15196            4          167          0

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28929558/viewspace-1150766/,如需轉載,請註明出處,否則將追究法律責任。

相關文章