データベースを復元すると、特定の設定(基本的に:テーブルとインデックス)が設定されていない限り、行間(またはインデックス内)に空のスペースがなく、すべての情報がパックされています。FILLFACTOR
FILLFACTOR
一方、データベースがしばらく使用されていて、挿入、更新、削除を共有している場合は、未使用の空き領域が表示されます。これは、PostgreSQLおよびMultiversion Concurrency Control(別名MVCC)の動作方法が原因です。MVCCはより少ないロックを可能にします。つまり、基本的に時間を節約し ます。しかし、あなたはスペースの面で代価を支払います:
- Every
UPDATE
は、とをINSERT
組み合わせたものに相当DELETE
し、オーバーヘッドは(少なくとも使用されるスペースに関して)両方に関連付けられています。
- 複数のトランザクションを実行していて、すべてが
INSERT
ing、UPDATE
ing、またはDELETE
ingである場合、関係するすべての行の複数のコピーが同時に存在します。
- これらの行バージョンに割り当てられたスペースは、コミット後すぐには解放されず、しばらくの間、テーブルデータ(およびインデックス)が格納されているファイル内の未使用スペースになります。
Autovacuumは、このスペースがデフォルトで再利用可能になるように処理します。または、ルーチンの掃除のための特定の手順を用意することもできます。
この事実はすでにサイズの変化を説明することができます。
バージョン間の最適化もおそらく行われました。さらに改善を説明できます。サイズではなく速度を最適化することもでき、実際のサイズは実際にバージョンごとに大きくなる可能性があります。具体的には、具体的にはわかりません。ただし、@ Erwinからのコメントでは、テーブルを縮小する変更とテーブルを肥大化(拡張)する変更の両方がバージョン8.3以降行われたと述べています。
2つの効果を区別するために、もし興味があれば、@ Jack Douglasが示唆するように、データベースを8.3に復元することができます。それはおそらくサイズが縮小します。それが151 MB(9.4バージョンよりも小さいサイズ)に縮小した場合、未使用のスペースを削除するとDBが縮小し、バージョンの変更により実際にDBが拡大しました。
MVCCの理解を深めるには、Bruce Momjianのプレゼンテーションをご覧ください。