テーブルのすべての行に対して単純な更新を実行する必要があります。テーブルには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を使用していますが、まもなくアップグレードされる予定です。したがって、新しいバージョンでの変更についての言及はありがたいです。
単に意味がありません。 autovacuum
は、実行中のトランザクションでロックされている行をクリーンアップしません。だからautovacuum
しかし、私が認識している意味のある意味で、更新がブロックされたり遅くなったりすることはありません。