ヒープテーブル(デフォルトの記憶域)でUPDATEおよびDELETEステートメントを実行しており、定期的にVACUUMを実行している場合は、デザインによって膨らんでしまいます。デフォルトのPostgreSQLストレージメカニズムに似ているヒープストレージは、MVCC(Multi-Version Concurrency Control)を使用してリード一貫性を提供します。
レコードを更新または削除すると、古い値がテーブルに残っていて、UPDATEまたはDELETEコマンドを発行する前に実行中で、開始されたトランザクションでも読み取ることができます。これにより、テーブルに読み取りの一貫性が提供されます。
VACUUMステートメントを実行すると、データベースは古い行を上書き可能としてマークします。ファイルを縮小しません。上書きできるように行をマークするだけです。次にINSERTまたはUPDATEを実行すると、古いデータを新しいデータに使用できるようになりました。
したがって、実行中のVACUUM間でテーブルの10%を更新または削除すると、おそらく約10%の膨れがあります。
Greenplumには、MVCCを使用せず、代わりに可視性マップを使用するAppend-Optimized(AO)ストレージもあります。ファイルも少し小さくなっているので、パフォーマンスが向上します。失効した行は可視性マップで隠され、gp_appendonly_compaction_thresholdの割合に達するまでVACUUMは何もしません。デフォルトは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);