Postgresql的vacuum機制一些理解
阿新 • • 發佈:2020-12-27
我們知道,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資料庫核心分析》