跳轉到內容

PostgreSQL/可見性對映和空閒空間對映

來自華夏公益教科書


每個表都儲存在單獨的磁碟檔案中。這些檔案的名稱由數字組成,這些數字是系統目錄中使用的表的內部物件識別符號 (OID)。每個這樣的檔案都附帶一個用於其可見性對映的檔案和另一個用於其空閒空間對映的檔案。它們具有相同的名稱,副檔名為 '_vm' 和 '_fsm'。例如,這種三元組檔名的示例是:3083、3083_vm 和 3083_fsm。

這兩個附加檔案包含元資訊,用於最佳化對原始檔案的 I/O 活動,尤其是針對真空和凍結,但也用於其他寫入活動。由於 I/O 按物理頁面工作,元資訊地址完整的物理頁面,而不是像行或版本這樣的頁面任何部分。

可見性對映

[編輯 | 編輯原始碼]

可見性對映為原始檔案的每個頁面包含兩個標誌 - 儲存為兩個位。第一個位表示關聯的頁面只包含有效的行版本,即沒有要真空的膨脹。第二個位表示頁面只包含已凍結的行版本。

請考慮兩個細節。首先,在大多數情況下,一個頁面包含許多行或行版本。但是,這兩個標誌都與頁面相關聯,而不是與單個行或行版本相關聯。只有當標誌對頁面上儲存的所有行版本有效時,才會設定標誌。其次,由於每個頁面只有兩位(兩位對應於 8 千位元組,大約是 1:32.000 的關係),可見性對映比原始檔案小得多。

VACUUM 和自動真空設定標誌。對頁面上任何行版本的任何寫入操作都會清除標誌。

可見性對映幫助 VACUUM 和自動真空節省不必要的 I/O。當第一個位被設定時,沒有必要讀取原始頁面並檢查其內容以刪除膨脹。很明顯沒有膨脹。相應地,如果 VACUUM 或自動真空必須執行行的凍結,它們可以跳過第二個位表明頁面只包含已凍結的行版本的頁面 - 不需要凍結。

空閒空間對映

[編輯 | 編輯原始碼]

空閒空間對映跟蹤每個頁面的空閒未使用空間量。它被組織為一個高度壓縮的 (rounded) 每個頁面空閒空間大小的 B 樹。

VACUUM 和自動真空根據其寫入操作(將行版本標記為“已過時”並重新排列頁面的物理佈局)更改空閒空間對映。其他寫入操作會查詢空閒空間對映以找到具有足夠空閒空間以進行預期寫入操作的頁面,並在之後更改空閒空間對映。


華夏公益教科書