PostgreSQL Freeze 風暴預測續 - 珍藏級SQL

標籤

PostgreSQL , Freeze , 風暴git

背景

PostgreSQL 目前默認的存儲引擎,事務可見性須要依賴行頭的事務號,由於事務號是32位的,會循環使用。github

在一條記錄產生後,若是再次經歷了20億個事務,必須對其進行freeze,不然數據庫會認爲這條記錄是將來事務產生的(可見性判斷)。數據庫

所以FREEZE操做是數據庫在32位事務號的狀況下,常常要作的。post

對全表進行FREEZE操做時,會掃描整表,將大於指定閾值least(autovacuum_freeze_min_age, 表級參數vacuum_freeze_min_age)年齡的記錄設置爲freeze。可能致使大量的讀IO,寫IO(主要是寫數據文件,WAL日誌, full page write WAL)。spa

一些參數決定數據庫在何時觸發FREEZE,以及觸發FREEZE時,凍結哪些記錄,以及是否涉及到調度(sleep)。日誌

同時不少參數有庫級、表級選項。表級優先,而後是庫級,最後是實例級。code

《PostgreSQL GUC 參數級別介紹》blog

一、多久檢查一次哪些表是否須要FREEZE事務

postgres=# show autovacuum_naptime ;    
 autovacuum_naptime     
--------------------    
 1s    
(1 row)

二、哪些表須要被自動FREEZE,get

超過以下閾值,若是設置了表級參數則以表級參數爲準,不然以系統參數爲準。

表級參數    
autovacuum_freeze_max_age    
autovacuum_freeze_table_age    
    
系統級參數    
autovacuum_freeze_max_age

三、手工執行普通vacuum時,哪些表會被掃描全表,並freeze

超過以下閾值

系統級參數    
vacuum_freeze_table_age

注意,如今PG支持VM文件裏面記錄一個PAGE是否須要被FREEZE,因此即便全表掃描,也會根據VM標記位,跳過一些BLOCK,因此FREEZE並不必定會產生大量讀IO。根據表的狀況而定。

三、觸發FREEZE時,哪些記錄須要被FREEZE

超過以下閾值的記錄被FREEZE,若是設置了表級參數則以表級參數爲準,不然以系統參數爲準。

相關文章
相關標籤/搜索