閱讀59 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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時,隻有僅僅包含左右鏈接的頁(即沒有實際引用的頁)可以拆除複用。並且索引文件大小不會變化。

索引結構可以參考

《深入淺出PostgreSQL B-Tree索引結構》

隻有重建索引才能收縮索引大小。

使用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

  上一篇:go  新零售空間數據庫實踐一例 - PostGIS 點麵疊加視覺判斷輸出
  下一篇:go  PostgreSQL 俄羅斯發行版Postgrespro的特性