1. 必定要開啓autovacuum。
2. 提升系統的IO能力,越高越好。
3. 調整觸發閾值,讓觸發閾值和記錄數匹配。調小autovacuum_vacuum_scale_factor和autovacuum_analyze_scale_factor。好比我想在有1萬條垃圾記錄後就觸發垃圾回收,那麼對於一個1000萬的表來講,我應該把
autovacuum_vacuum_scale_factor調到千分之一即0.001,而
autovacuum_analyze_scale_factor應該調到0.0005。
4. 增長autovacuum_max_workers,同時增長autovacuum_work_mem,同時增長系統內存。
例如對於有大量表須要頻繁更新的數據庫集羣,能夠將
autovacuum_max_workers調整爲與CPU核數一致,並將
autovacuum_work_mem調整爲2GB,同時須要確保系統預留的內存大於
autovacuum_max_workers*
autovacuum_work_mem。
5. 應用程序設計時,儘可能避免持有事務Exclusive鎖的長事務(DDL,DML都會持有
事務Exclusive鎖
)
6. 對於IO沒有問題的系統,關閉autovacuum_vacuum_cost_delay。
7. 調整autovacuum_naptime參數到最低,若是仍是喚醒時間太長,能夠調整代碼中的限制,例如改成1毫秒:
#define MIN_AUTOVAC_SLEEPTIME 1.0 /* milliseconds */
8. 應用程序設計時,避免使用大批量的更新,刪除操做,能夠切分爲多個事務進行。
9. 使用大的數據塊,對於現代的硬件水平,32KB是比較好的選擇,fillfactor實際上不須要太關注,100就能夠了,調低它其實沒有必要,由於數據庫老是有垃圾,也就是說每一個塊在被更新後實際上都不多是滿的。
10. 萬一真的膨脹了,能夠經過table rewrite來回收(如vacuum full, cluster),可是須要遲排他鎖。建議使用pg_reorg或者pg_repack來回收,實際上用到了交換 filenode能夠縮短鬚要持有排他鎖的時間。