Greenplum ao表和heap表垃圾回收的細微差別
標簽
PostgreSQL , Greenplum , 垃圾回收 , vacuum
背景
在Greenplum中刪除、更新數據記錄時,會產生新的tuple版本,老的版本通過行頭部標記:為已刪除以及被哪個事務刪除的。
因此頻繁的更新後,或者批量的刪除數據後,需要回收那些舊的版本。
通過vacuum、vacuum full、alter table redistribute命令,可以回收垃圾。
《如何檢測、清理Greenplum垃圾 - 阿裏雲HybridDB for PG最佳實踐》
但是回收AO表與回收HEAP表有些許不一樣的地方,因為它們的存儲方式有差異。
vacuum ao表
ao表為追加存儲,當刪除、更新記錄時,有一個BITMAP對象來存儲對應的記錄是否被刪除。
每個AO表的每個數據文件對應一條BITMAP信息,每個BIT位對應這個數據文件的一行。
使用vacuum回收AO表的垃圾時,實際上是這樣操作的:
1、掃描bitmap,如果發現這個數據文件中被標記為刪除的BIT總數大於某個閾值,則收縮這個文件。(每個數據文件默認1GB)
2、收縮這個文件時,因為會導致記錄的物理位置編號,所以需要變更對應的索引(可能導致索引膨脹)。
vacuum ao表時,允許INSERT,COPY寫入數據,但是不允許UPDATE和INSERT操作。(GPDB中UPDATE和DELETE是鎖全表的,另一方麵引入了update和delete後AO表收縮會變得更加複雜。)
3、VACUUM對應的索引,索引VACUUM時,隻有僅僅包含左右鏈接的頁(即沒有實際引用的頁)可以拆除複用。並且索引文件大小不會變化。
索引結構可以參考
隻有重建索引才能收縮索引大小。
使用alter table redistribute命令,本質上也是需要重建索引的。
vacuum heap表
vacuum heap表,掃描所有數據文件,同時抹除BLOCK內dead tuple的item和tuple占用的空間,同時抹除對應索引ITEM。物理文件大小不會變化,(除了最後一個文件的末尾的沒有任何有效記錄的塊。)
其他因素
vacuum 能回收的垃圾,不能被其他事務依賴。目前PG是這樣來判斷的,垃圾版本大於當前集群中最老事務的快照號的,都不能被回收。
《PostgreSQL垃圾回收代碼分析 - why postgresql cann't reclaim tuple is HEAPTUPLE_RECENTLY_DEAD》
小結
1、Greenplum ao表使用vacuum可以回收部分垃圾(並收縮文件大小)(當某些數據文件垃圾記錄超過一定設定比例時),VACUUM時堵塞UPDATE和DELETE,但是不堵塞INSERT。收縮文件大小,可能導致索引膨脹。
2、HEAP表vacuum可以回收垃圾,但是不收縮文件。
如果有維護窗口,還是建議使用這種方法來回收空間。
《如何檢測、清理Greenplum垃圾 - 阿裏雲HybridDB for PG最佳實踐》
最後更新:2017-09-18 00:04:25