web-dev-qa-db-ja.com

INSERTのみを受け取るテーブルでVACUUMを実行することは価値がありますか?

2015年のre:Inventの講演で、AWSはバキュームは更新または削除の後だけでなく挿入後にも実行する必要があると述べました。講演の関連部分は次のとおりです。

http://www.youtube.com/watch?v=tZXp19q8RFo&t=16m2s

おそらく、ブロックが挿入のみを受け取った場合でも、ブロックに対して実行する必要があるクリーンアップがあり、このクリーンアップは、ブロックが最初に選択されたとき(読み取りを遅くする)またはバキューム中に実行できます。これは本当ですか、もしそうなら、正確にどのクリーンアップを実行する必要がありますか?

19
foobar0100

tl; dr:データがコミットされた後にデータを読み取る最初のプロセスは、ヒントビットを設定します。これはページをダーティにし、書き込みアクティビティを作成します。 VACUUM(他のコマンドではなく)が行うもう1つのことは、必要に応じて、ページをすべて表示可能としてマークすることです。 VACUUMは最終的にテーブルをヒットしてタプルを凍結する必要があります。

挿入後に行う必要がある作業は、少なくとも他の作業VACUUMが通常行う作業とは異なり、実際にはクリーンアップされません。詳細に入る前に、この回答は現在の(リリースされていない)9.6コードに基づいており、可視性に影響を与える可能性があるとしても、ストリーミングレプリケーションの影響を無視していることに注意してください。

[〜#〜] mvcc [〜#〜] のため、Postgresがタプルをクエリに表示する必要があるかどうかを評価するたびに、タプルを作成したトランザクション(xminに記録されている)かどうかを考慮する必要があります隠しフィールド)いくつかの他の基準とともにコミットされます。このチェックは負荷が高いため、現在開いているすべてのトランザクションからトランザクションが見えることがわかるとすぐに、Tupleヘッダーに「ヒントビット」が設定され、それを示します。そのビットの設定はページを汚します。つまり、ディスクに書き込む必要があります。 データを読み取る次のコマンドがSELECTであり、突然大量の書き込みトラフィックが発生している場合、これは非常に混乱する可能性があります。実行中挿入コミット後のVACUUMはそれを回避します。もう1つの重要な違いは、VACUUMは常に(ページにクリーンアップロックを取得している限り)ページのタプルにヒントを提供しますが、他のほとんどのコマンドは挿入トランザクションがコミットされた場合にのみヒントを提供しますbeforeコマンドが開始されました。

これらすべてのヒントビットを書き込む際の重要な点は、VACUUMを調整できることです(自動バキュームはデフォルトで調整されます)。他のコマンドは抑制されず、ダーティデータを可能な限り迅速に生成します。

VACUUMは、ページをすべて表示可能とマークする唯一の方法です。これは、一部の操作(特に、インデックスのみのスキャン)で重要なパフォーマンスの考慮事項です。大規模な挿入を行う場合、新しく挿入されたタプルのみを含むページが多数ある可能性が非常に高くなります。 VACUUMは、これらのページをすべて表示可能とマークする可能性があります。ただし、VACUUMの開始時に実行中の最も古いトランザクションが、データを挿入したトランザクションよりも新しい場合のみ

MVCCのしくみのため、約20億トランザクション以上前に挿入されたタプルは、「 frozen "としてマークする必要があります。デフォルトでは、autovacuumは2億トランザクションごとにそれを実行します。一括挿入の後に、vacuum_freeze_min_ageを0に設定して手動バキュームを実行すると、その影響を減らすことができます。より積極的には、挿入後にテーブルで_VACUUM FREEZE_を実行できます。これは、次のフリーズスキャンが発生するときに「時計をリセット」します。

特定の詳細を知りたい場合は、HeapTupleSatisfiesVacuum()内のlazy_scan_heap()を呼び出した後の_HEAPTUPLE_LIVE_のケースをご覧ください。 HeapTupleSatisfiesVacuum()自体も参照し、HeapTupleSatisfiesMVCC()と比較してください。

興味深いかもしれない私の他の2つのプレゼンテーションがあります。最初のビデオは http://www.pgcon.org/2015/schedule/events/829.en.html から入手できますが、2番目のビデオは(少し良かったと思います)- https://www.youtube.com/watch?v=L8nErzxPJjQ

15
Jim Nasby