web-dev-qa-db-fra.com

Devrais-je désactiver Autovacuum sur une table pendant que je fais une mise à jour en vrac?

J'ai besoin d'effectuer une mise à jour simple sur toutes les lignes d'une table. La table a 40 à 50 millions de lignes. Déposer des index et des contraintes au cours de l'UPDATE donne une amélioration massive des performances.

Mais qu'en est-il d'Autovacuum? Peut-on démarrer un VACUUM ou ANALYZE au milieu d'un UPDATE? Si oui, ce serait un travail inutile qui mangerait des ressources de la machine. Je pourrais le désactiver sur la table avant le UPDATE, puis le réactivez ensuite:

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);

Cela fonctionne-t-il même si je ne vous engagez pas après le premier ALTER?

De plus, si je le désactive pendant le UPDATE, cela déclenche-t-il après la mise à jour, ou ignorera-t-il ces mises à jour car elle était désactivée pendant leur handicap? (Ma suspicion est que cela fonctionnera, mais je préfère être sûr.)

J'utilise PG 9.3 en ce moment, mais devriez-vous passer prochainement. Donc, toute mention des changements de versions plus récentes est appréciée.

7
jpmc26

Non

Il n'y a tout simplement aucun point. autovacuum _ ne nettoiera pas de lignes verrouillées dans une transaction en cours d'exécution. Alors autovacuum

  • peut ne rien faire d'utile.
  • peut signaler que les lignes sont mortes et non indemnvable
  • peut faire quelque chose d'utile avec les autres rangées (s'il y en a une).

Mais cela ne bloquera pas et ne ralentira pas la mise à jour d'un sens significatif que je suis au courant.

6
Evan Carroll