我在Greenplum中創建了一些表,執行插入更新和刪除操作。經常我也在進行真空操作。我發現它膨脹。找到解決方案來消除臃腫https://discuss.pivotal.io/hc/en-us/articles/206578327-What-are-the-different-option-to-remove-bloat-from-a-table刪除greenplum表中的膨脹
但是,如果我截斷表並重新插入數據,它會消除膨脹。截斷表中的數據是否是一種好的做法?
我在Greenplum中創建了一些表,執行插入更新和刪除操作。經常我也在進行真空操作。我發現它膨脹。找到解決方案來消除臃腫https://discuss.pivotal.io/hc/en-us/articles/206578327-What-are-the-different-option-to-remove-bloat-from-a-table刪除greenplum表中的膨脹
但是,如果我截斷表並重新插入數據,它會消除膨脹。截斷表中的數據是否是一種好的做法?
如果您正在堆表(默認存儲)上執行UPDATE和DELETE語句並定期運行VACUUM,那麼您將會在設計中遇到一些問題。堆存儲與默認的PostgreSQL存儲機制相似,它使用多版本併發控制(MVCC)提供讀一致性。
當您更新或刪除記錄時,舊值仍在表中,並且可以在發出UPDATE或DELETE命令之前由仍在飛行中並且已啓動的事務讀取。這爲表提供了讀取一致性。
當您執行VACUUM語句時,數據庫會將舊數據行標記爲可被覆蓋。它不收縮文件。它只是標記行,以便它們可以被覆蓋。下一次執行INSERT或UPDATE時,陳舊的行現在可以用於新數據。
因此,如果您在運行VACUUM之間更新或刪除10%的表,您可能會有大約10%的膨脹。
Greenplum還具有追加優化(AO)存儲,它不使用MVCC並使用可見性映射代替。這些文件比較小,所以你應該獲得更好的性能。陳舊的行被隱藏了可見性映射,VACUUM在你達到gp_appendonly_compaction_threshold百分比之前不會執行任何操作。默認值是10%。當你在AO表中有10%的膨脹並執行VACUUM時,表格會自動爲你重建。
出於向後兼容性的原因,Append-Optimized被稱爲「appendonly」,但它確實允許UPDATE和DELETE。這裏是一個AO表的例子:
CREATE TABLE sales
(txn_id int, qty int, date date)
WITH (appendonly=true)
DISTRIBUTED BY (txn_id);