誰かがこれらのVACUUM
の型の違いをPostgreSQLで説明できますか?
私はドキュメントを読みましたが、FULL
がテーブルをロックし、FREEZE
がタプルを「フリーズ」するとだけ書いてあります。私も同じだと思います。私が間違っている?
ここに短い簡潔な答えがあります。
Vacuum fullは、排他ロックを解除し、テーブルを再構築して、空のブロックがないようにします(ここでは、Fill Factorが100%であると仮定します)。
バキュームフリーズは、テーブルの内容に特別なトランザクションタイムスタンプを付け、postgresにバキュームする必要がないことを通知します。次の更新この凍結IDは表示されなくなります。
たとえば、template0データベースは変更されないため、フリーズされています(デフォルトでは接続できません)。
Autovacuumデーモンは、データベースとそのテーブルをチェックして、何をバキュームする必要があるかを頻繁に確認します。テーブルがバキュームフリーズされ、その後更新されない場合、autovacuumデーモンは単にそれを渡します。また、postgresqlの「ラップアラウンド」保護は、そのテーブルにも影響を与えません。
tl; dr freezingは、テーブルをautovacメンテナンスを必要としないものとしてマークします。次のアップデートでフリーズが解除されます。
ジャヤデヴァンが書いたことをさらに説明する。
Postgresがトランザクションを処理し、可視データを追跡する方法は、内部トランザクションIDを比較することです。ただし、これらのトランザクションは遅かれ早かれ32ビット整数になるため、ラップアラウンドされ、新しいトランザクションは過去に作成されたように見えます(したがって、現在のトランザクションでは表示されませんが、表示されません)。古いトランザクションは、将来行われるように見えます(将来がまだ存在しないため、そのデータは表示されなくなります)。
この問題に対処するためにPostgresが行うことは、このラップアラウンドの影響を受けるリスクがあるほど古くなっている各行を、常にすべてのトランザクションよりも古い特別なトランザクションIDに割り当てることです。有効なトランザクションIDの範囲が0〜2147483647であるかのように表示され、現在のすべての行のトランザクションIDが-1に設定されます。
ただし、バキュームは基本的に空のスペースに再利用のマークを付けるため、変更されたデータページでのみ機能します。
何 VACUUM FREEZE
doは、変更されているかどうかに関係なく、基本的にすべてのページのトランザクションIDをフリーズするため、すべての新しいトランザクションで現在のすべての行が古いと見なされます。
ただし、バージョン8.2以降VACUUM FREEZE
は非推奨であり、使用すべきではありません。代わりに、パラメータvacuum_freeze_table_age
およびautovacuum_freeze_max_age
これは、テーブルで完全なスキャンが実行される前に発生できるトランザクションの数を指定します(事実上、内部VACUUM FREEZE
(テーブル上)。
私が同じ質問をしたときの回答からコピー/貼り付け-「通常のバキュームは、再利用のために空のスペースにマークを付け、関係の最後で空のスペースを再利用します。したがって、空のスペースが中央などにある場合、それはできません再利用されたばかりです。
バキュームフルは、すべての空きスペースを再利用する関係を圧縮します。これには排他ロックが必要であり、これが原因で、一般に本番システムには適していません。
したがって、通常のバキュームの目的は、テーブルからスペースを再利用することではなく、後で再利用できるようにすることです。バキュームFULLの目的は、発生中の排他ロックとデータベースのパフォーマンスを犠牲にして、無駄なスペースをすべて回収することです。
したがって、通常の掃除機はすべてを取り戻すようには設計されていないので、実際にはすべてを取り戻さなかったとしても、驚いてはいけません。通常の真空と完全な真空の違いを確認するために、ランダムな削除が多いなど、より大きなデータセットで実験してみてください。」
http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html
これに追加するには、vacuum fullは実際にテーブルの新しいファイルを作成します(既存のファイルは0サイズに縮小されます)。したがって、OSはスペースを再利用できます。