从greenplum表中删除膨胀

时间:2017-09-06 03:31:46

标签: greenplum

我在Greenplum中创建了一些表,执行插入更新和删除操作。我也经常进行真空操作。我发现它膨胀了。找到解决膨胀问题的解决方案https://discuss.pivotal.io/hc/en-us/articles/206578327-What-are-the-different-option-to-remove-bloat-from-a-table

但是,如果我截断表并重新插入数据,则会删除膨胀。从表中截断数据是一种好习惯吗?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

最好使用drop table,创建表然后插入数据,而不是截断。