J'utilise PostgreSQL 9.1 sur Ubuntu. Sont-ils VACUUM ANALYZE
toujours recommandés ou l’autovacuum suffit-il pour répondre à tous les besoins?
Si la réponse est "ça dépend", alors:
- J'ai une base de données assez longue (taille de dump compressée de 30 Go, répertoire de données de 200 Go)
- Je fais l'ETL dans la base de données, en important près de 3 millions de lignes par semaine
- Les tables avec les modifications les plus fréquentes sont toutes héritées d'une table maître, sans aucune donnée dans la table maître (les données sont partitionnées par semaine)
- Je crée des cumuls horaires, et à partir de là, des rapports quotidiens, hebdomadaires et mensuels
Je demande parce que la planification a une VACUUM ANALYZE
incidence sur mes rapports. Cela dure plus de 5 heures et j'ai dû le tuer deux fois cette semaine, parce que cela affectait les importations de bases de données régulières. check_postgres
ne signale aucune accumulation importante dans la base de données, ce n'est donc pas vraiment un problème.
Dans les documents, autovacuum devrait également s'occuper de l'identification de la transaction. La question reste posée: ai-je encore besoin d'un VACUUM ANALYZE
?
postgresql
etl
vacuum
François Beausoleil
la source
la source
Réponses:
VACUUM n'est nécessaire que sur les lignes mises à jour ou supprimées dans les tables non temporaires. Évidemment, vous faites beaucoup d’insert, mais il n’est pas évident, dans la description, que vous faites aussi beaucoup de mises à jour ou de suppressions.
Ces opérations peuvent être suivies avec la
pg_stat_all_tables
vue, en particulier les colonnesn_tup_upd
etn_tup_del
. De plus, il existe unen_dead_tup
colonne qui indique, par table, combien de lignes doivent être aspirées. (Voir Surveillance des statistiques dans le document pour connaître les fonctions et les vues relatives à la collecte de statistiques).Une stratégie possible dans votre cas serait de supprimer le VACUUM prévu, en gardant un œil sur cette vue et en vérifiant les tables qui
n_dead_tup
sont en train d'augmenter considérablement. Ensuite, appliquez le VACUUM agressif à ces tables uniquement. Ce sera une victoire s'il y a de grandes tables dont les lignes ne sont jamais supprimées ni mises à jour et le VACUUM agressif n'est vraiment nécessaire que sur des tables plus petites.Mais continuez à exécuter ANALYZE pour que l'optimiseur dispose toujours de nouvelles statistiques.
la source
Je ne vois rien dans votre question qui
autovacuum
ne s'en occupe pas. Cela dépend en grande partie du modèle de vos activités d'écriture . Vous mentionnez 3 millions de nouvelles lignes par semaine, maisINSERT
(ouCOPY
) généralement, ne créez pas de table et d'index. (autovacuum
ne doit s’occuper que des statistiques de colonne , de la carte de visibilité et de quelques travaux mineurs).UPDATE
etDELETE
sont la principale cause de gonflement des tables et des index, en particulier lors du ciblage de lignes aléatoires. Je ne vois rien de cela dans votre question.autovacuum
a parcouru un long chemin et fait un excellent travail dans Postgres 9.1 ou version ultérieure. Je voudrais regarder lesautovacuum
paramètres . Si l'aspiration a tendance à interférer avec votre charge de travail, jetez également un coup d'oeil à "Délai d' aspiration basé sur les coûts" . L'aspiration manuelle devrait être la rare exception.Si vous avez beaucoup de messages aléatoires
UPDATE
, vous pouvez définirFILLFACTOR
une valeur inférieure à 100, pour autoriser les mises à jour HOT immédiatement et réduire les besoinsVACUUM
. Plus sur les mises à jour HOT:Notez également que les tables temporaires ont besoin de manuel
VACUUM
&ANALYZE
. Je cite le manuel surCREATE TABLE
:la source
Bien que je convienne que l’utilisation des fonctionnalités automatiques est préférable au lieu de l’utiliser dans toute la base de données, dans la plupart des cas, un réglage par table est nécessaire.
Je ne suis pas tout à fait d'accord avec le choix de conception de postgres pour lier ensemble le vide et l'analyse. J'ai vu plusieurs cas dans lesquels des bases de données faisant beaucoup d'insert / mises à jour mais peu de suppressions ne sont jamais analysées et commencent à mal fonctionner.
La solution consiste à accéder aux tables fortement utilisées et sujettes aux requêtes volumineuses, puis à définir les paramètres d'analyse automatique pour ces tables de manière à ce qu'elles soient analysées une ou deux fois par jour.
Vous pouvez accéder aux paramètres par table dans l’interface graphique dans l’onglet Aspiration automatique et y afficher des paramètres d’analyse que vous pouvez définir indépendamment du vide.
Les paramètres se retrouvent dans la table des reloptions et peuvent être vus avec la requête
et une valeur d'échantillon d'une analyse agressive pourrait être
Pour voir quand la dernière fois que vos tables ont été analysées automatiquement
la source
ANALYZE
, comment PostgreSQL saura-t-il que les statistiques ont changé? Et comment pouvez-vous déterminer que celaANALYZE
prend beaucoup de temps? Dans le même temps, bien que l’interface graphique que vous avez mentionnée ci-dessus ne soit pas clairement définie, vous avez raison de préciser que les paramètres spécifiques à chaque table peuvent être utiles.