web-dev-qa-db-ja.com

一括更新を行う間、テーブルの自動バキュームを無効にする必要がありますか?

テーブルのすべての行に対して単純な更新を実行する必要があります。テーブルには4,000〜5,000万行あります。 UPDATEの実行中にインデックスと制約を削除すると、パフォーマンスが大幅に向上します。

しかし、autovacuumはどうですか?自動バキュームはVACUUMの途中でANALYZEまたはUPDATEを開始できますか?もしそうなら、それはマシンのリソースを使い果たすだろう無駄な仕事でしょう。 UPDATEの前にテーブルで無効にして、後で再び有効にすることができます。

ALTER TABLE my_table
SET (autovacuum_enabled = false, toast.autovacuum_enabled = false);
-- Drop constraints, drop indexes, and disable unnecessary triggers

UPDATE my_table SET ....;

-- Restore constraints, indexes, and triggers
ALTER TABLE my_table
SET (autovacuum_enabled = true, toast.autovacuum_enabled = true);

最初のALTERの後でコミットしなくてもこれは機能しますか?

また、UPDATEの最中に無効にした場合、更新後の更新がトリガーされますか、それとも無効になっているために更新が無視されますか? (私の疑いはそれが実行されることですが、私はむしろ確信したいと思います。)

現在PG 9.3を使用していますが、まもなくアップグレードされる予定です。したがって、新しいバージョンでの変更についての言及はありがたいです。

7
jpmc26

番号

単に意味がありません。 autovacuumは、実行中のトランザクションでロックされている行をクリーンアップしません。だからautovacuum

  • 役立つことは何もないかもしれません。
  • 行がdeadおよびnonremovableであると報告する場合があります
  • 他の行(ある場合)で何か役立つことがあります。

しかし、私が認識している意味のある意味で、更新がブロックされたり遅くなったりすることはありません。

6
Evan Carroll