天天看點

HybridDB for PostgreSQL 列存表(AO表)的膨脹、垃圾檢查與空間收縮

PostgreSQL , Greenplum , 垃圾檢測 , 膨脹 , 列存表 , gp_appendonly_compaction_threshold

Greenplum支援行存儲(堆存儲)與AO存儲,堆存儲的垃圾回收和膨脹檢測方法請參考:

<a href="https://github.com/digoal/blog/blob/master/201708/20170817_01.md">《如何檢測、清理Greenplum膨脹、垃圾 - 阿裡雲HybridDB for PG最佳實踐》</a>

對于AO存儲,雖然是appendonly,但實際上GP是支援DELETE和UPDATE的,被删除或更新的行,通過BITMAP來标記。

AO存儲是塊級組織,當一個塊内的資料大部分都被删除或更新掉時,掃描它浪費的成本實際上是很高的。

如何檢查AO表的膨脹,收縮AO表呢?

pg_class.relstorage表示這個對象是什麼存儲:

查詢目前資料庫有哪些AO表:

查詢目前資料庫有哪些堆表:

使用這個函數可以檢視AO表的膨脹率

例子

解讀:

1、content:對應gp_configuration.content,表示greenplum每個節點的唯一編号。

2、datafile:這條記錄對應的這個表的其中一個資料檔案的編号,每個資料檔案假設1GB。

3、compaction_possible:這個資料檔案是否可以被收縮。(通過gp_appendonly_compaction_threshold參數和percent_hidden值判斷)。

4、hidden_tupcount:有多少條記錄已更新或删除(不可見)。

5、total_tupcount:總共有多少條記錄(包括已更新或删除的記錄)。

6、percent_hidden:不可見記錄的占比。如果這個占比大于gp_appendonly_compaction_threshold參數,那麼執行vacuum時,會收縮這個資料檔案。

膨脹率超過千分之2的AO表:

傳回結果

顯然膨脹了100%,驗證如下(1條記錄有效,占用了15GB空間):

vacuum可以直接收縮(因為膨脹率大于gp_appendonly_compaction_threshold參數):

VACUUM後,隻占用40位元組。

方法有三:

1、執行VACUUM。(當膨脹率大于gp_appendonly_compaction_threshold參數時),為共享鎖。

2、執行VACUUM FULL。(不管gp_appendonly_compaction_threshold參數的設定,都會回收垃圾空間。),為DDL鎖。

3、執行重分布。(不管gp_appendonly_compaction_threshold參數,都會回收垃圾空間。),為DDL鎖。

set distribute可以回收索引的膨脹空間。set distribute 加載的鎖與DDL鎖類似,是排它鎖。建議在沒有業務的時候執行,不要堵塞業務。

同時set distribute隻要分布條件不變,就是在節點内完成的,不會涉及資料的重分布。

建議的操作流程:

<a href="http://greenplum.org/docs/510/admin_guide/managing/maintain.html">http://greenplum.org/docs/510/admin_guide/managing/maintain.html</a>