詳解Oracle rowid之來龍去脈

來源:互聯網
上載者:User

rowid 從字面解釋為行標識。在Oracle中,通過rowid定位記錄是最快和最有效方式。那麼rowid在oracle中是怎樣定位記錄的哪?並且它為什麼是最有效方式?帶著這些問題,讓我們一步一步揭開rowid的神秘面紗。

首先,我們看一下怎樣擷取表中記錄的rowid:通過rowid偽列

SQL> select rowid,id from ppp;

ROWID      ID
------------------ ----------
AAAS5VAAEAAAAemAAC    3
AAAS5VAAEAAAAemAAD    9
AAAS5VAAEAAAAemAAE    7

我們知道,oracle在邏輯上有多個資料表空間構成,每個資料表空間又包含多個資料檔案,資料檔案對應作業系統上的檔案(asm情況類似,不做考慮),而資料檔案又包含若干資料區塊,我們的表記錄就是儲存在資料區塊中。因此,如果我們知道某條記錄所儲存的資料檔案、資料區塊和在塊中的位移量,就可以非常快速的讀取記錄並展現給使用者。rowid恰恰可以協助我們實現這一點,因為在rowid字串中包含了資料檔案、資料區塊和記錄在塊中地址的資訊。

在8i之前,oracle採用受限的rowid(Restricted rowid),受限rowid是針對整個資料庫範圍的rowid,由三部分構成,即資料檔案編號,塊編號和記錄在塊內的位移量。受限rowid佔用6個位元組的儲存空間,其中資料檔案編號佔用10bit,資料區塊編號佔用22bit,位移量即記錄在資料區塊中的行號佔用16bit。從這裡我們也可看出在8i之前的資料庫中:

每個資料庫最多包含1022個檔案(2個檔案預留)

每個檔案最多可以有4m個資料區塊

每個塊最多可以儲存64k條記錄。

受限的rowid在底層儲存使用二進位格式,展現時採用varchar2和16進位混合的形式:BBBBBBBB.RRRR.FFFF (block#.row#.file#),如:

SQL> select dbms_rowid.rowid_to_restricted('AAAS5VAAEAAAAemAAE',0) from dual;

DBMS_ROWID.ROWID_T
------------------
000007A6.0004.0004

到目前為止,情況都是非常明朗的,但是隨著oracle的發展,我們需要突破某些限制,例如單個資料庫最多1022個資料檔案的限制,同時我們還要保持資料庫的向後相容性以及為資料庫的某些特性如資料表空間遷移做出充分的考慮。在這種情況下,僅僅只是通過擴充受限rowid的儲存長度是不夠的,例如我們將資料檔案編號佔用的儲存空間從10bit擴增到20bit,雖然可以在單個資料庫中儲存更多的資料檔案,但是卻增加了向後相容的難度(因為實體儲存體格式發生了變化),而且在使用資料表空間遷移時,如果從舊版本遷移到8i之後的版本,我們需要掃描整個遷移的資料表空間來修改其中儲存的rowid資訊,這顯然與資料表空間遷移的初衷(通過拷貝檔案和匯入中繼資料資訊來匯入資料表空間)是相違背的。

為了達到以上種種目的,oracle引入了相對檔案號的概念,這種方法的主要思想是改變之前rowid中資料檔案編號是參考整個資料庫範圍i的事實,將其參考的範圍改為資料表空間,即檔案編號為4的檔案不再是資料庫中編號為4的資料檔案,而是某個資料表空間中編號為4的資料檔案。這樣我們便可以在不改變實體儲存體格式的情況下(僅僅是我們在解析rowid內容時的處理邏輯發生了變化,如將前10bit解析為資料表空間相對檔案號rfn,而不是檔案號file_id,然後通過資料字典視圖將),進行資料庫的擴容等等。

SQL> select file_id,relative_fno from dba_data_files;

  FILE_ID RELATIVE_FNO
---------- ------------
  4      4
  3      3
  2      2
  1      1
  5      5
  6      6
  7      6
  8      8
  9      9

從這裡我們看到file_id和relative_fno是一一相等的,其實不然,在資料檔案數量沒有超過1022個時,oracle資料庫盡量保持file_id和relative_fno的相同,在超過1022個資料檔案後,oracle就會保證在整個資料庫內file_id是唯一的,在單個資料表空間中relative_fno是唯一的。

那麼這時就會存在一個問題,不同資料表空間中的具有相同相對檔案號資料檔案oracle是怎樣區分開來的那?為瞭解決這個問題,oracle在原有6byte rowid的基礎上又添加了DATA_OBJECT_ID的資訊,構成擴充rowid,即擴充rowid由四部分構成:data_object_id,rfn,block#,row#。通過data_object_id 和資料字典視圖的結合,oracle可以非常快速的將rfn轉換為file_id,從而也就可以準確的進行行定位。

我們以11g中索引的儲存格式為例,總結如下:

普通表:

--普通索引:6位元組
row#0[8020] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 02
col 1; len 6; (6):  01 00 05 e3 00 00
row#1[8008] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 03
col 1; len 6; (6):  01 00 05 e3 00 01
row#2[7996] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 04
col 1; len 6; (6):  01 00 05 e3 00 02

--全域分區:
row#0[8020] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 02
col 1; len 6; (6):  01 00 05 e3 00 00
row#1[8008] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 03
col 1; len 6; (6):  01 00 05 e3 00 01
row#2[7996] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 04
col 1; len 6; (6):  01 00 05 e3 00 02
----- end of leaf block dump -----

分區表:

--全域分區:分區  10位元組
col 0; len 2; (2):  c1 02
col 1; len 10; (10):  00 01 2e 55 01 00 07 a6 00 00
row#1[7984] flag: ------, lock: 0, len=16
col 0; len 2; (2):  c1 04
col 1; len 10; (10):  00 01 2e 55 01 00 07 a6 00 02
row#2[7968] flag: ------, lock: 0, len=16
col 0; len 2; (2):  c1 08
col 1; len 10; (10):  00 01 2e 55 01 00 07 a6 00 04
row#3[7952] flag: ------, lock: 0, len=16
col 0; len 2; (2):  c1 0a
col 1; len 10; (10):  00 01 2e 55 01 00 07 a6 00 03

---本地索引:6位元組
row#0[8020] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 04
col 1; len 6; (6):  01 00 07 a6 00 02
row#1[8008] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 08
col 1; len 6; (6):  01 00 07 a6 00 04
row#2[7996] flag: ------, lock: 0, len=12
col 0; len 2; (2):  c1 0a
col 1; len 6; (6):  01 00 07 a6 00 03
----- end of leaf block dump -----

更多詳情見請繼續閱讀下一頁的精彩內容:

Oracle rowid   

Oracle入門基礎教程:rowid詳解

Oracle 中ROWNUM用法總結,ROWNUM 與 rowid 區別

rowid走索引之嫌疑犯抓獲

Oracle利用rownum和rowid分頁

  • 1
  • 2
  • 3
  • 下一頁

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.