天天看點

資料庫頁面結構——Oracle篇(二)

頁面是資料庫存儲管理的基本機關,也是和磁盤互動的最小機關。頁面在資料庫中有承上啟下的作用,頁面支撐着資料庫的各種管理功能,包括表管理、索引管理、叢集管理以及緩沖區管理等。在頁面上也儲存着資料庫中最重要的資訊——使用者資料,是以頁面的管理非常重要,今天接着讨論oracle頁面管理更詳細的内容,主要包括頁公共頭、事務層、表目錄、項目錄、資料區域以及尾巴。

資料庫頁面結構——Oracle篇(二)

page common header

oracle資料庫的頁公共頭是所有的頁面都有的一個結構,其大小為20個位元組,内容主要包括:

1、頁面的類型,占用1byte:表頁面、索引頁面、復原段頁面或者臨時表頁面等

2、頁面的版本資訊,占用1byte:目前資料頁面是a2

3、保留白間,占用2byte,一般都被填充成0x0000

4、資料頁面的實體位址,占用4byte,也被稱為rdba資訊(relative data block address):包括檔案号和檔案内的偏移等

5、scn(system change number ) base 資訊,占用4個位元組

6、scn wrap 資訊,占用2位元組

7、seq(sequence number)資訊,占用1byte

8、flg(flags)資訊,占用1byte

9、校驗資訊,占用2個位元組:儲存頁面校驗值,用于檢查頁面的完整性,如果是0x0000表示沒打開校驗功能,隻有将 db_block_checksum 設定為true時才會進行校驗。

10、保留白間,占用2byte,一般都被填充成0x0000

transaction layer

oracle資料庫頁面的事務層主要包括兩個部分的資訊。

固定部分:

1、頁面類型,占用1byte,0x01表示資料頁面

2、對象編号,占用4byte,這個數值在前面的rowid中可以找到

3、頁面最後一次刷出的時間,簡稱為:csc(cleanout scn),占用4byte。

4、itl(interested transaction list )項數目,簡稱為:itc(interested transaction count ),占用1byte

5、bdba(block relative data block address )資訊,占用4byte

除此之外,還有下面資訊,但這幾個資訊的值都是0,再沒有仔細确認它們的儲存位置:

a. 标志資訊,如果頁面在空閑清單中,此标志将被标記成大寫字母o

b. 空閑空間鎖,簡稱為: fsl(free space lock)

c. 下一個空閑頁面指針,簡稱為:fnx(free next block)

變化部分:主要是itls資訊

預設情況下隻包含表資料的頁面隻有一個itl,但對于包含索引資料的頁面,會有兩個itl資訊。

在建立索引和表時,通過initrans子句可以修改預設的itl的數量,對于并發要求高的應用,最好将此值設定的大一點。itl的數量的取值範圍是1~255,設定的越大,事務層占用的空間就越多,頁面能儲存的資料就越少,但并發性越好。建議不要走兩個極端,設定的符合真實的應用即可,用4、8、16幾個值。

每一個itl大小為24位元組,但這個結構大小與不同的版本相關,我參考的是oracle12c文檔中的值。

itl結構體主要包括下面資訊:

1、事務号,簡稱為:xid(transaction id ),占用8byte

2、復原頁面位址,簡稱為:uba(undo block address ),占用8byte

3、事務狀态辨別,占用1byte

4、事務在目前頁面持有的鎖總數,占用1byte

5、一個scn或者一個fsc(free space credit),占用6byte

table directory

因為oracle有些頁面上會儲存多個表的資料,主要是使用了聚集的情況下同一個頁面會儲存多個表資料。下面是表目錄的詳細内容:

1、表目錄個數,占用1byte

2、表資料在項目錄上的索引偏移,簡稱為:pti(position table indicates) ,每個表項占用2byte,第一個表一般都是0x0000。

需要注意的是,表目錄個數和表目錄這兩部分内容并沒有儲存在一起,這個相關的内容,下次會繼續說明。

row directory

項目錄是一個複雜的結構體,其中記錄了資料行和頁面空間相關的重要資訊,具體如下:

1、頁面上的資料項個數,簡稱為:nrow,占用2byte

2、第一個空閑項的位置,簡稱為:frre(first free row entry),如果沒有就用0xffff填充。

3、空閑空間起始位置,簡稱為:fsbo(free space begin offset ),占用2byte。

4、空閑空間結束位置,簡稱為:fseo(free space end offset ),占用2byte。

5、頁面可用空間大小,簡稱為:avsp(available space),占用2byte

6、頁面總的空間,簡稱為:tosp(total space ),占用2byte

7、項目錄數,後面的有效的項目錄個數,占用2byte。

8、每一行起始位置在頁面上的偏移,簡稱為:pri(position row indicates),項目錄中的每一項占用2byte。

舊的版本中,項目錄中除了儲存項的偏移之外,還儲存了項的一些簡單狀态資訊,例如:删除項,連結項,遷移項等狀态資訊。後來支援的頁面大小有所擴充,目前已經将這些資訊都儲存到了行資料頭上。

row data

行資料部分主要包含這個頁面上的使用者資料,每一行是一塊連續的空間,前幾個是行頭資訊,其後緊跟行的所有資料。

行資料上面儲存的内容主要有:行狀态辨別、行上的鎖類型、列偏移數組、聚集鍵的位置和所有的列資料。以後介紹行結構的時候會涉及到這部分内容,到時候再詳細的介紹。

tail

每個頁面的最後四個位元組用于檢查頁面塊是否是同一次寫入磁盤的頁面,以避免寫磁盤到一半的時候突然斷電引起的頁面不一緻的情況。

oracle的頁面結構先介紹這麼多,下一次會實際的示範一下,如何看oracle的頁面結構。

<b></b>

<b>本文來自雲栖社群合作夥伴“dbgeek”</b>