真空凍結vs真空満杯


18

VACUUMPostgreSQLのこれらのタイプの違いを誰かが説明できますか?

私はドキュメントを読みましたが、それFULLはテーブルをロックしFREEZE、タプルを「フリーズ」するだけだと言っています。それは同じだと思います。私が間違っている?


ドキュメントを読みましたか?それはあなたが読んだものへのリンクを含めるには絶好の機会だろう...
アーウィンBrandstetter

回答:


12

ここに短い簡潔な答えがあります。

バキュームがいっぱいになると、排他ロックが解除され、空のブロックがなくなるようにテーブルが再構築されます(ここでは、フィルファクターが100%であると仮定します)。

バキュームフリーズは、テーブルの内容を非常に特別なトランザクションタイムスタンプでマークし、postgresにバキュームをかける必要がないことを伝えます。この更新されたIDは次に更新されなくなります。

たとえば、template0データベースは変更されないため凍結されます(デフォルトでは接続できません)。

頻繁にautovacuumデーモンはデータベースとそのテーブルをチェックして、バキュームする必要があるものを確認します。テーブルがバキュームフリーズされ、その後更新されない場合、autovacuumデーモンは単にそれを渡します。また、postgresqlの「ラップアラウンド」保護は、そのテーブルにも適用されません。

tl; dr凍結は、autovacのメンテナンスを必要としないテーブルをマークします。次の更新でフリーズ解除されます。


では、VACUUM FREEZEテーブルに排他ロックが必要ですか?そうでなければ、アクティブなトランザクションの行が突然グローバルに表示される危険があります。私は...それを誤解される可能性があります
パルティアショット

バキュームフリーズはありませんが、バキュームフルはしません。
スコットマーロウ

6

Jayadevanが書いたことをさらに説明するため。

Postgresがトランザクションを処理し、可視データを追跡する方法は、内部トランザクションIDを比較することです。ただし、これらのトランザクションは遅かれ早かれ32ビット整数であるため、新しいトランザクションは過去に作成されたように見えます(したがって、現在のトランザクションでは表示されないはずですが)。古いトランザクションは、将来行われているように見えます(未来はまだ存在しないため、そのデータは表示されなくなります)。

この問題に対処するためにPostgresが行うことは、このラップアラウンドの影響を受けるリスクがあるほど古い各行に、常にすべてのトランザクションよりも古い特別なトランザクションIDを割り当てることです。有効なトランザクションIDの範囲が0〜2147483647の場合、現在のすべての行のトランザクションIDを-1に設定するように見えます。

ただし、バキュームは基本的に再利用のために空のスペースをマークすることなので、変更されたデータページでのみ機能します。

どのようなVACUUM FREEZE彼らは、現在のすべての行がすべての新しいトランザクションのための古いとして見られることを、変更またはないされている場合は、基本的に関係なく、すべてのページのトランザクションIDを凍結されていないでください。

ただし、バージョン8.2の時点でVACUUM FREEZE廃止されているため、使用しないでください。代わりに、パラメータがvacuum_freeze_table_ageありautovacuum_freeze_max_age、テーブルで完全なスキャンが実行される前に発生するトランザクションの数を指定します(テーブルで内部VACUUM FREEZEを効果的に実行します)。


3
ドキュメントVACUUM FREEZEが非推奨/非推奨であることを言及していないのはどうですか?
dezso

面白い。8.2と9.0の間のバージョンで行われました。おそらく彼らは、それが良い機能になる可能性があるため、廃止予定を削除しました。
ジミーステンケ14年

1

同じ質問をしたときの答えからコピー/貼り付け-「通常のバキュームは再利用のために空のスペースをマークし、関係の最後に空のスペースを回収します。したがって、空のスペースが真ん中にある場合など再利用されたばかり。

vacuumは、空のスペースをすべて取り戻す関係を圧縮します。排他ロックが必要であり、このため、一般に本番システムには不適切です。

したがって、通常のバキュームの目的は、テーブルからスペースを回収することではなく、後で再利用できるようにすることです。バキュームFULLの目的は、実行中に排他的ロックとdbパフォーマンスを犠牲にしてすべての無駄なスペースを再利用することです。

したがって、通常のバキュームはすべてを回収するようには設計されていないため、実際にはすべてを回収しなかったことに驚かないでください。通常のバキュームと完全なバキュームの違いを確認するために、ランダムな削除などの大きなデータセットで実験してみてください。」

http://postgresql.1045698.n5.nabble.com/vacuuming-doubt-td5782828.html

これに追加するために、vacuum fullはテーブルの新しいファイルを実際に作成します(既存のファイルはサイズが0に縮小されます)。したがって、OSはスペースを再利用できます。


2
質問はVACUUM FREEZE特に求めています。
アーウィンブランドステッター14年

True-「PostgreSQLのこのタイプのバキュームの違い」-私は質問がバキュームのタイプの違いについてだと思った。
ジャヤデヴァン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.