2017-09-06 220 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);