關於oracle中的row piece

tengrid發表於2009-05-18

有部分初學者在看oracle docs中關於row format的描述時可能會有個疑問,既然row會移動或連結,那它在不同的block中的部分的地址是不是會變化?

 

要解答這個問題,還得從rowid的結構說起

顯然rowid是包括了block address的,既然一個記錄行被分佈到了不同的block,那這幾個不同的部分當然具有不同的rowid

下面再引申說明row的格式組成

1,我們知道,row是由一個或多個piece組成的,下面是一些基本的規則

2, 如果columns <256,且能在一個block中儲存,那麼只有一個 piece

3, 如果columns>=256,且能在一個block儲存,那麼每行的第256列以後形成的piece會與1-255列組成的piece 連結在一起,這種情況叫做intra-blockchaining; 即跨內連結

4, 如果不能在一個block中儲存,那麼就會有多個pieces chained在一起.每個piece在一個block中; 或者原來以一個piece儲存在一個block中,後來因update,導致在一個block中儲存不下,必須跨塊儲存; 這種情況是跨塊連結

不管是塊內連結還是塊間連結,piece之間都是透過piece的rowid來連線的,實際上相當於一個單向連結串列

所以不難理解row piece的格式中包括了"Rowid of chained row pieces":

Row Overhead
Number of Columns
Cluster Key ID (if clustered)
ROWID of Chained Row Pieces (if any)
Column Length
Column Value

當我們根據rowid 來fetch有多個piece的行時(select,update,delete)

server process只需要找到第一個piece的rowid即可,因為它的header中包含有下一個piece的rowid,如此類推;process可以根據這個關係拿到所有的piece然後組裝起來,返回給使用者

有關row format及在row在cluster的情況下的表現可以參見<>P116

 

有空再補充dump塊來驗證上述規則的測試過程

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

相關文章