힙 테이블 (기본 저장소)에서 UPDATE 및 DELETE 문을 수행하고 VACUUM을 정기적으로 실행하는 경우 설계 상 약간의 부 풀림이 발생합니다. 기본 PostgreSQL 저장 메커니즘과 유사한 힙 저장소는 MVCC (Multi-Version Concurrency Control)를 사용하여 읽기 일관성을 제공합니다.
레코드를 업데이트하거나 삭제하면 이전 값이 여전히 테이블에 있으며 UPDATE 또는 DELETE 명령을 실행하기 전에 기내에서 실행 중이며 시작된 트랜잭션에서 읽을 수 있습니다. 이것은 테이블에 읽기 일관성을 제공합니다.
VACUUM 문을 실행하면 데이터베이스가 오래된 행을 덮어 쓸 수있는 것으로 표시합니다. 파일을 축소하지 않습니다. 덮어 쓸 수 있도록 행을 표시합니다. 다음에 INSERT 또는 UPDATE를 실행하면 부실 행을 이제 새 데이터에 사용할 수 있습니다.
따라서 실행중인 VACUUM간에 테이블의 10 %를 업데이트하거나 삭제하면 약 10 %의 부풀림이 생길 수 있습니다.
Greenplum에는 MVCC를 사용하지 않고 가시성 맵을 대신 사용하는 Append-Optimized (AO) 스토리지가 있습니다. 파일도 조금 작아서 더 나은 성능을 얻을 수 있습니다. 낡은 행은 가시성 맵으로 숨겨져 있으며 VACUUM은 gp_appendonly_compaction_threshold 비율에 도달 할 때까지 아무 것도하지 않습니다. 기본값은 10 %입니다. AO 테이블에서 10 %가 부풀어 오르고 VACUUM을 실행하면 테이블이 자동으로 재구성됩니다.
하위 최적화와 관련하여 Appendonly는 "appendonly"라고하지만 UPDATE 및 DELETE는 허용됩니다. 다음은 AO 표의 예입니다.
CREATE TABLE sales
(txn_id int, qty int, date date)
WITH (appendonly=true)
DISTRIBUTED BY (txn_id);