pg_visibility
模組提供了一種檢查資料表的顯式映射 (VM) 及頁面層級的顯式資訊的方法。它也提供了檢查顯式映射表完整性及強制重建它的函式。
使用了三個不同的位元來儲存關於頁面層級可見性的資訊。 可見性映射表中的 all-visible 位元表示關聯中的相應頁面中的每個元組對於每個目前及未來的交易都是可見的。 可見性映射表中的 all-frozen 位元表示頁面中的每個元組都已凍結; 也就是說,在該頁面上插入、更新、刪除或鎖定元組之前,未來的 vacuum 不需要修改該頁面。 頁首的 PD_ALL_VISIBLE
位元具有與可見性映射表中的 all-visible 位元相同的含義,但儲存在資料頁面本身中,而不是在單獨的資料結構中。 這兩個位元通常會一致,但在崩潰復原後,頁面的 all-visible 位元有時可能會在可見性映射表位元清除時設定。 報告的值也可能因 pg_visibility
檢查可見性映射表後和檢查資料頁面之前發生的變更而不同意。 任何導致資料損毀的事件也可能導致這些位元不同意。
顯示關於 PD_ALL_VISIBLE
位元資訊的函式比僅查詢可見性映射表的函式成本更高,因為它們必須讀取關係的資料區塊,而不是僅讀取(小得多的)可見性映射表。 檢查關係資料區塊的函式也同樣昂貴。
pg_visibility_map(relation regclass, blkno bigint, all_visible OUT boolean, all_frozen OUT boolean) returns record
傳回給定關係的給定區塊中,可見性映射表裡的 all-visible 和 all-frozen 位元。
pg_visibility(relation regclass, blkno bigint, all_visible OUT boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) returns record
傳回給定關係的給定區塊中,可見性映射表裡的 all-visible 和 all-frozen 位元,再加上該區塊的 PD_ALL_VISIBLE
位元。
pg_visibility_map(relation regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean) returns setof record
傳回給定關係的每個區塊中,可見性映射表裡的 all-visible 和 all-frozen 位元。
pg_visibility(relation regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) returns setof record
傳回給定關係的每個區塊中,可見性映射表裡的 all-visible 和 all-frozen 位元,再加上每個區塊的 PD_ALL_VISIBLE
位元。
pg_visibility_map_summary(relation regclass, all_visible OUT bigint, all_frozen OUT bigint) returns record
根據可見性映射表,傳回關係中 all-visible 頁面的數量和 all-frozen 頁面的數量。
pg_check_frozen(relation regclass, t_ctid OUT tid) returns setof tid
傳回儲存在可見性映射表中標記為 all-frozen 的頁面中的非凍結元組的 TIDs。 如果此函式傳回非空的 TIDs 集合,則可見性映射表已損壞。
pg_check_visible(relation regclass, t_ctid OUT tid) returns setof tid
傳回儲存在可見性映射表中標記為 all-visible 的頁面中的非 all-visible 元組的 TIDs。 如果此函式傳回非空的 TIDs 集合,則可見性映射表已損壞。
pg_truncate_visibility_map(relation regclass) returns void
截斷給定關係的可見性映射表。 如果您認為關係的可見性映射表已損壞,並且希望強制重建它,則此函式很有用。 在執行此函式後,在給定關係上執行的第一個 VACUUM
將掃描關係中的每個頁面並重建可見性映射表。 (在完成之前,查詢將把可見性映射表視為包含所有零。)
預設情況下,這些函式只能由超級使用者及具有 pg_stat_scan_tables
角色權限的角色執行,但 pg_truncate_visibility_map(relation regclass)
只能由超級使用者執行。
Robert Haas <rhaas@postgresql.org>
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用此表單來回報文件問題。