簡單總結一下rowid的相關知識

oracle_ace發表於2007-12-17

rowid在磁碟上需要10 個位元組的儲存空間並使用18 個字元來顯示它包含下列元件:

資料物件編號:每個資料物件如表或索引在建立時都分配有此編號,並且此編號在資料庫中是唯一的;

相關檔案編號:此編號對於一個表空間中的每個檔案是唯一的;

塊編號:表示包含此行的塊在檔案中的位置;

行編號:標識塊頭中行目錄位置的位置;

在內部資料物件編號需要32位,相關檔案編號需要10位,塊編號需要22位,位行編號需要16位,加起來總共是80位或10 個位元組,ROWID 使用以64為基數的編碼方案來顯示該方案將6個位置用於資料物件,編號3個位置用於相關檔案編號,6個位置用於塊編號,3個位置用於行編號以64為基數的編碼方案使用字元A-Z a-z 0-9 + 和/共64 個字元,如下例所示:
AAAB/R AAB AAAGmS AAA

在本例中

AAAB/R   是資料物件編號

AAB     是相關檔案編號

AAAGmS  是塊編號

AAA      是行編號

這裡再版補充一下:
由於block是22位,因此一個資料檔案中最多可以有2^22 -1個資料塊
2K資料庫的資料檔案的size最大隻能是8G
而依此類推8K資料塊的一個資料檔案的最大size只能是32G

有個指令碼再記錄一下:
create or replace function get_rowid
(l_rowid in varchar2)
return varchar2
is
ls_my_rowid  varchar2(200);         
rowid_type  number;         
object_number  number;         
relative_fno  number;         
block_number  number;         
row_number  number; 
begin
dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_number, row_number);         
ls_my_rowid := 'Object# is      :'||to_char(object_number)||chr(10)||
  'Relative_fno is :'||to_char(relative_fno)||chr(10)||
  'Block number is :'||to_char(block_number)||chr(10)||
  'Row number is   :'||to_char(row_number);
return ls_my_rowid ;
end;         
/create or replace function get_rowid
(l_rowid in varchar2)
return varchar2
is
ls_my_rowid  varchar2(200);         
rowid_type  number;         
object_number  number;         
relative_fno  number;         
block_number  number;         
row_number  number; 
begin
dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_number, row_number);         
ls_my_rowid := 'Object# is      :'||to_char(object_number)||chr(10)||
  'Relative_fno is :'||to_char(relative_fno)||chr(10)||
  'Block number is :'||to_char(block_number)||chr(10)||
  'Row number is   :'||to_char(row_number);
return ls_my_rowid ;
end;         
/
通過此自定義function我們可以很方便的獲得rowid的相關資訊.

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

相關文章