Greenplum支持行储存(HEAP储存)与列(append-only)储存,AO存储虽然是appendonly,但实际上Greenplum是支持DELETE和UPDATE操作的,被删除或更新的行通过BITMAP来标记删除与修改。AO存储是块级组织,当一个块内的数据大部分都被删除或更新时,扫描它浪费的成本会非常高。PostgreSQL通过HOT技术以及autovacuum来避免或减少垃圾,但Greenplum没有自动回收的worker进程,需要手动触发空间释放。下面介绍三种释放空间的方法:
- 执行VACUUM:当膨胀率大于
gp_appendonly_compaction_threshold
参数时,执行此操作会为共享锁。 - 执行VACUUM FULL:不受
gp_appendonly_compaction_threshold
的限制,执行后会回收垃圾空间,为DDL锁。需要谨慎使用,因为它可能会导致CPU和IO占满。 - 执行重分布:不受
gp_appendonly_compaction_threshold
的限制,回收垃圾空间,且为DDL锁。