ROWID簡介

ddlovefish發表於2013-12-08
rowid標誌記錄物理位置的一個id,在 8版本以前,rowid由file# block# row#組成,佔用6個bytes的空間,10 bit 的 file# ,22bit 的 block# ,16 bit 的 row#。

8開始rowid變成了extend rowid,由data_object_id# rfile# block# row#組成,佔用10個bytes的空間, 32bit的 data_object_id#,10 bit 的 rfile#,22bit 的 block#,搜尋16 bit 的 row#.由於rowid的組成從file#變成了rfile#,所以資料檔案數的限制也從整個庫不能超過1023個變成了每個不能超過1023個 資料檔案。
說了rowid的組成,那麼我們再來看看rowid在索引裡面佔用的位元組數又是什麼樣子的。在
8以前索引中儲存的rowid佔用位元組數也是6bytes,在oracle8之後,雖然oracle使用了extend rowid,但是在普通索引裡面依然儲存了bytes的rowid,只有在global index中儲存的是10bytes的extend rowid,而extend rowid也是global index出現的一個必要條件,下面我們會解釋原因。

為什麼golbal index需要把data_object_id#也包含在index rowid entry中呢?如果不包含會這麼樣?首先我們需要知道index的rowid entry的存在是為了能根據它找到表的這條記錄存在哪個具體的物理位置,我們需要知道它在哪個資料檔案,在哪個block,在那一行,普通的索引 oracle根據rfile#,block#,row#就可以知道了,但是partition table可以分佈在多個
,也就是可以分佈在多個資料檔案,當我們建立local index時,index rowid entry並不包含data_object_id#,因為oracle可以知道這個index對應的是哪一個table分割槽,並可以得到table分割槽的 ts#(tablespace號),那麼oracle根據ts#和rfile#就可以找到具體的資料檔案。但是如果換成是golbal index,如果不包含data_object_id#,那麼我們並不能知道這個索引對應著哪個表分割槽,也自然不能知道它的rfile#和file#的轉換關係,所以它將找不到所對應的記錄。包含data_object_id#後,oracle可以根據data_object_id#實現rfile#和 file#的轉換然後找到記錄對應的物理位置。需要注意的是要理解以上概念我們還是需要了解file#和rfile#的區別。

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