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>