删除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);