1. 程式人生 > 資料庫 >Postgresql的vacuum機制一些理解

Postgresql的vacuum機制一些理解

我們知道,postgresql(以下簡稱pg)多版本控制mvcc和oracle有所不同,oracle通過回滾段實現,資料更新之前先將舊版本資料寫入回滾段,然後再將待更新資料寫入原data block,而pg mvcc則是當元組發生更改時,直接在原資料data page插入一條新的記錄,同時將原元組邏輯上標識為刪除,這些標識為刪除的元組也叫死元組。這就導致當進行多次更新和刪除操作,磁碟上會多出很多死元組,佔用了很多磁碟空間並且導致系統性能下降。
vacuum的作用則是回收這些這些無效的空間。

vacuum命令

VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]

其中option可以是下列之一:

    FULL [ boolean ]
    FREEZE [ boolean ]
    VERBOSE [ boolean ]
    ANALYZE [ boolean ]
    DISABLE_PAGE_SKIPPING [ boolean ]
    SKIP_LOCKED [ boolean ]
    INDEX_CLEANUP [ boolean ]
    TRUNCATE [ boolean ]

而table_and_columns是:

    table_name [ ( column_name [, ...] ) ]

full vacuum和lazy vacuum

full vacuum:會加上排他鎖,這意味著full vacuum期間,讀寫操作會被阻塞起來。並在執行過程中會生成fraged_pages和vacuum_pages兩個連結串列,fraged_pages是可填充元組的檔案塊,而vacuum_pages是待清理的死元組檔案塊。當掃完關係表後,通過fraged_pages對有效元組跨塊移動,通過vacuum_pages對死元組進行清理,並把清理後的磁碟空間歸還給作業系統。
lazy vacuum: 不會加上排他鎖,讀寫操作可並行,只是簡單死元組塊標識為未使用,這些檔案塊不會歸還給作業系統。

analyze

更新優化器的統計資訊。當一張表(特別是大表)短時間頻繁更新,優化器的統計資訊是不及時的,或者是不準確的。這樣會導致優化器執行查詢sql時選擇錯誤的執行計劃,導致sql查詢效能差。可功過analyze更新指定表(甚至指定列)的統計資訊。

參考文獻

1、http://www.postgres.cn/docs/12/sql-vacuum.html
2、《postgresql資料庫核心分析》