À certaines occasions, et après avoir fait un massif update
, insert
ou à delete
partir d'une table, j'ai commencé un VACUUM FULL ANALYZE
pour m'assurer que la DB ne se gonflait pas trop. Le faire dans une base de données de production m'a permis de découvrir que ce n'était pas une bonne idée, car je pouvais bloquer la table pendant une longue période. J'ai donc annulé le processus, peut-être essayé juste VACUUM
(pas complètement) ou laissé AUTOVACUUM
faire plus tard ce qu'il peut faire.
La question est: si j'arrête un VIDE ou un AUTOVACUUM "à mi-chemin", tout le traitement déjà fait est-il perdu?
Par exemple, si VACUUM
j'ai déjà trouvé 1 M de lignes mortes et que je l'arrête, toutes ces informations sont-elles perdues? VACUUM fonctionne-t-il de manière entièrement transactionnelle ("tout ou rien", comme un très bon nombre de processus PostgreSQL)?
Si VACUUM peut être interrompu en toute sécurité sans que tout le travail soit perdu, y a-t-il un moyen de rendre le vacuum
travail incrémentiel? [Travaillez pendant 100 ms, arrêtez, attendez 10 ms pour permettre de ne pas bloquer le reste du monde ... et ainsi de suite]. Je sais que vous pouvez faire une partie de cela en ajustant les paramètres du vide automatique, mais je pense à pouvoir contrôler cela par programme, pour pouvoir le faire à certains moments / dans certaines conditions.
REMARQUE: Arrêter / annuler / tuer le processus signifie dans ce contexte:
- Si vous utilisez pgAdmin, appuyez sur le bouton "Annuler la requête".
- Si vous travaillez par programmation, appelez pg_cancel_backend ().
Je suppose que les deux sont équivalents. Je n'ai utilisé aucune commande kill au niveau shell / système.
la source
vacuum_cost_page_hit
etvacuum_cost_page_miss
à zéro.