Vacuum 和 Vacuum Full 的處理過程


Vacuum過程

vacuum的執行過程主要分為以下三步:

    1. 清除dead tuples指向的index tuples

        該過程中,vacuum會順序掃描目標表,並構建一個dead tuples組成的list鏈表,該list鏈表會存儲在maintenance_work_mem緩存中。然后vacuum根據dead  tuples list移除dead tuples指向的index。

    2. 移除dead tuples,更新VM和FSM

        這里的移除dead tuples只是標記為可重用該空間,並沒有真正物理刪除。所以vacuum清理表后,表的實際空間並沒有減小。dead tuples在做移除標記后,vacuum會重新排列剩余的元組以進行碎片化整理。然后,需要更新目標表的VM(可見性映射文件)和FSM(空閑空間映射文件)。

    3. 更新統計信息和相關系統表

        最后,需要更新vacuum目標表的統計信息(以適應最新的查詢優化)和相關系統表。

Vacuum Full過程

    Vacuum Full和Vacuum最大的不同就是,Vacuum Full是物理刪除dead tuples,並把釋放的空間重新交給操作系統,所以在vacuum full后,表的大小會減小為實際的空間大小。其處理過程和vacuum大不相同,處理步驟如下:

    1.  vacuum full開始執行時,系統會先對目標創建一個AccessExclusiveLock ,不允許外界再進行訪問(為后面拷貝做准備),然后創建一個表結構和目標表相同的新表。

    2. 掃描目標表,把表中的live tuples 拷貝到新表中。

    3. 刪除目標表,在新表上,重新創建索引,更新VM, FSM以及統計信息,相關系統表等。

    所以,vacuum full的本質是生成一個新的數據文件,然后把原有表的live tuples存放到該數據文件中。對比vacuum, vacuum full缺點就是在執行期間不能對表進行訪問,由於需要往新表中導入live tuples數據,其執行效率也會很慢。優點是執行后,表空間只存放live tuples,沒有冗余的dead tuples,在執行查詢效率上會有所提高。

 

AutoVacuum守護進程

    由於vacuum是數據庫系統的一個例行性維護,所以系統啟動后,會開啟一個autovacuum守護進程專門對此處理。autovacuum清理進程一般用vacuum而避免使用vacuum full。理由是,vacuum盡管可以保持表的最小尺寸,但是如果表還有繼續增長的空間,這么做就意義不大了,特別是對於頻繁寫入的表。而且vacuum在執行效率上也比vacuum full好。

    上面所說的autovacuum進程是一個launcher進程,它不進行vacuum操作,它負責啟動vacuum worker進程,然后由vacuum worker進程進行相應的vacuum和analyze操作。

                                                6d3a60b6d87741180bd4914ba18176430cc.jpg

autovacuum進程會在每autovacuum_naptime時間間隔內為數據庫啟動autovacuum worker進程。然后每個worker進程會檢查數據庫中的每一個表,在需要時執行vacuum或analyze操作。如果有N個數據庫,則每 autovacuum_naptime/N秒將啟動一個新worker進程,在同一時間只允許最多autovacuum_max_workers 個worker進程運行,如果有超過autovacuum_max_workers 個數據庫需要被處理,下一個數據庫將在第一個worker結束后馬上被處理。

來自:https://my.oschina.net/tianbing/blog/3029706

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM