2017-09-06 222 views

回答

0

如果您正在堆表(默認存儲)上執行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);