J'essaie de faire en sorte que PostgreSQL ™ aspire de manière agressive ma base de données. J'ai actuellement configuré le vide automatique comme suit:
- autovacuum_vacuum_cost_delay = 0 # Désactive le vide basé sur les coûts
- autovacuum_vacuum_cost_limit = 10000 #Max
- autovacuum_vacuum_threshold = 50 # Valeur par défaut
- autovacuum_vacuum_scale_factor = 0.2 # Valeur par défaut
Je remarque que le vide automatique ne se déclenche que lorsque la base de données n'est pas chargée, alors je me retrouve dans des situations où il y a beaucoup plus de nuplets morts que de nuplets réels. Voir la capture d'écran ci-jointe pour un exemple. Une des tables a 23 tuples vivants mais 16845 tuples morts en attente d'aspiration. C'est dingue!
Le vide automatique démarre lorsque le test est terminé et que le serveur de base de données est inactif, ce qui n'est pas ce que je veux car je voudrais que le vide automatique démarre lorsque le nombre de tuples morts dépasse 20% de tuples vivants + 50, comme l'a été la base de données configuré. L'aspiration automatique lorsque le serveur est inactif me sert à rien, car le serveur de production est censé atteindre des milliers de mises à jour / s pendant une période prolongée, raison pour laquelle j'ai besoin de l'aspiration automatique même si le serveur est chargé.
Y a-t-il quelque chose qui me manque? Comment forcer l'aspiration automatique à fonctionner lorsque le serveur est soumis à une charge importante?
Mise à jour
Cela pourrait-il être un problème de verrouillage? Les tables en question sont des tables récapitulatives qui sont remplies via un déclencheur après insertion. Ces tables sont verrouillées en mode SHARE ROW EXCLUSIVE pour empêcher les écritures simultanées sur la même ligne.