1.可見性映射
清理過程的代價高昂,為了減小清理的開銷,在PostgreSQL 8.4版中引入了VM。
VM的基本概念很簡單。 每個表都擁有各自的可見性映射,用于保存表文件中每個頁面的可見性。 頁面的可見性確定了每個頁面是否包含死元組。清理過程可以跳過沒有死元組的頁面。清理過程為指定的表,或數據庫中的所有表執行以下任務。
圖1-1 VM的使用方式
2.改進的VM
因為它始終會掃描所有頁面。盡管一個頁中所有元組都被凍結,也會被掃描。
為了解決這一問題,9.6版本改進了可見性映射VM與凍結過程。新VM包含著每個頁面中所有元組是否都已被凍結的信息。在迫切模式下進行凍結處理時,可以跳過僅包含凍結元組的頁面。
圖2-1 改進的VM
根據VM中的信息,凍結此表時會跳過第0頁。在更新完1號頁面后,相關的VM信息會被更新,因為該頁中所有的元組都已經被凍結了。該偽碼分為兩大塊:一塊是依次處理表的循環,一塊是后處理邏輯。而循環塊又能分為三個部分,每一個部分都有各自的任務。接下來會描述這三個部分,以及后處理的邏輯。