1.###自動vacuum開關
autovacuum = on; 預設開啟
2.###autovacuum執行頻率
autovacuum_naptime = 60s; 預設1分鐘
3.###autovacuum工作執行緒數
autovacuum_max_workers = 3;預設三個執行緒
4.###觸發autovacuum執行的閾值
auto vacuum執行的閾值(dead行大於這個值): autovacuum_vacuum_scale_factor × 表上記錄數 + autovacuum_vacuum_threshold
auto analyze執行的閾值(dead行大於這個值): autovacuum_analyze_scale_factor × 表上記錄數 + autovacuum_analyze_threshold
4.1##如何檢視錶上的死元組以及vacuum資訊
SELECT u.schemaname,u.relname,c.reltuples,u.n_live_tup,u.n_mod_since_analyze,u.n_dead_tup,u.last_autoanalyze,u.last_autovacuum
FROM
pg_stat_user_tables u, pg_class c, pg_namespace n
WHERE n.oid = c.relnamespace
AND c.relname = u.relname
AND n.nspname = u.schemaname
AND u.schemaname = 'public'
AND u.relname = 't01'
5.###表級別auto_vacuum閾值定義
ALTER TABLE pgbench_accounts SET (autovacuum_vacuum_scale_factor = 0.1, autovacuum_vacuum_threshold = 2000);
6.###vacuum記憶體引數
##vacuum記憶體
# - Memory -
#maintenance_work_mem = 64MB # min 1MB
#autovacuum_work_mem = -1
# min 1MB, or -1 to use maintenance_work_mem
# - Cost-Based Vacuum Delay -
##當VACUUM 工作超出一定量之後,會休眠vacuum_cost_delay這麼久的時間。
#vacuum_cost_delay = 0 # 0-100 milliseconds (0 disables)
#vacuum_cost_page_hit = 1 # 0-10000 credits
#vacuum_cost_page_miss = 10 # 0-10000 credits
#vacuum_cost_page_dirty = 20 # 0-10000 credits
#vacuum_cost_limit = 200 # 1-10000 credits
6.1##autovacuum_work_mem
autovacuum_work_mem,預設值為 -1,即同 maintenance_work_mem。maintenance_work_mem是手動vacuum的引數, 預設值為 64MB。
6.2##autovacuum工作“量”
vacuum_cost_limit
預設200秒
6.3##autovacuum工作時長超出後休眠時間
vacuum_cost_delay
預設為0,也即不休眠
6.4##autovacuum工作量評估標準
以下是三種不同 page 的 cost,預設值分別為 1、10、20,基本不用調整。
vacuum_cost_page_hit - The estimated cost for vacuuming a buffer found in the shared buffer cache.
vacuum_cost_page_miss - The estimated cost for vacuuming a buffer that has to be read from disk.
vacuum_cost_page_dirty - The estimated cost charged when vacuum modifies a block that was previously clean.
手動VACUUM 對應的引數是 maintenance_work_mem,vacuum_cost_delay 和 vacuum_cost_limit。
AUTOVACUUM 對應的引數是 autovacuum_work_mem,autovacuum_vacuum_cost_delay,autovacuum_vacuum_cost_limit。
1,適當增大 autovacuum_work_mem 和 autovacuum_vacuum_cost_limit、減少 autovacuum_vacuum_cost_delay 可提高 AUTOVACUUM 效能。
2,手動VACUUM設定Session級別引數
SET vacuum_cost_delay = 10;
VACUUM ANALYZE pgbench_accounts;
7.###vacuum freeze表相關的引數
7.1##vacuum_freeze_min_age
預設值5000萬,如果存在某個元組的事務年齡超過vacuum_freeze_min_age引數值時,就可以在vacuum時把該元組事務號凍結,也即將該元組事務id置為2
7.2##vacuum_freeze_table_age
預設值1.5億,強制執行急切凍結閾值,
7.3##autovacuum_freeze_max_age = 200000000
預設值2億,強制凍結新老事物id差距不能超過20億,這個差值的大小就是autovacuum_freeze_max_age的值
7.4##vacuum_multixact_freeze_min_age
預設值5000萬,這個引數用於控制多事務ID(multixact)達到多少年齡時觸發VACUUM操作。
7.5##vacuum_multixact_freeze_table_age
預設值是1.5億,
如果表的pg_class.relminmxid域超過了這個設定指定的年齡,VACUUM會執行一次激進的掃描。
激進的掃描與常規VACUUM的區別在於它會訪問每一個可能包含未凍結 XID 或者 MXID 的頁面,而不是隻掃描那些可能包含死亡元組的頁面。
7.6##autovacuum_multixact_freeze_max_age = 400000000
預設值是4億,
指定在一個VACUUM操作被強制執行來防止表中多事務ID回捲之前,一個表的pg_class.relminmxid域能保持的最大年齡(多事務的)。注意即便自動清理被禁用,系統也將發起自動清理程序來阻止回捲。
參考https://www.modb.pro/db/1724329716294426624這裡相關的引數以及事務凍結模式
凍結模式 | 觸發引數 | 預設數值 | 表級別引數設定 |
---|---|---|---|
懶惰模式(Lazy mode) | vacuum_freeze_min_age | 50000000 | autovacuum_freeze_min_age and toast.autovacuum_freeze_min_age |
飢渴(侵略)模式(Eager mode) | vacuum_freeze_table_age | 150000000 | autovacuum_freeze_table_age and toast.autovacuum_freeze_table_age |
強制模式 (Forced mode) | autovacuum_freeze_max_age | 200000000 | autovacuum_freeze_max_age and toast.autovacuum_freeze_max_age |
安全保護模式(Failsafe mode) | vacuum_failsafe_age(PG14開始支援) | 1600000000 | NA |
我們可以看到 觸發的引數從 5千萬->1.5億->2億->16億 逐步遞增。
來源: https://www.modb.pro/db/1724329716294426624