J'utilise PostgreSQL 9.1 sur Ubuntu. Sont programmés VACUUM ANALYZE
toujours recommandé, ou est-ce que l'autovacuum est suffisant pour répondre à tous les besoins?
Si la réponse est "cela dépend", alors:
Je demande parce que le VACUUM ANALYZE
a une incidence sur mes rapports. Il fonctionne pendant plus de 5 heures, et j'ai dû le tuer deux fois cette semaine, car cela affectait les importations régulières de bases de données. check_postgres
ne signale pas de ballonnement significatif sur la base de données, donc ce n'est pas vraiment un problème.
À partir des documents, autovacuum devrait également s'occuper de l'ID de transaction. La question se pose: ai-je encore besoin d'un VACUUM ANALYZE
?
VACUUM n'est nécessaire que sur les lignes mises à jour ou supprimées dans les tables non temporaires. De toute évidence, vous faites beaucoup d'insertions, mais il n'est pas évident d'après la description que vous faites également beaucoup de mises à jour ou de suppression.
Ces opérations peuvent être suivies avec le pg_stat_all_tables
vue, en particulier la n_tup_upd
et n_tup_del
Colonnes. De plus, plus précisément, il existe un n_dead_tup
colonne qui indique, par table, combien de lignes doivent être nettoyées. (voir Monitoring statistics dans le doc pour les fonctions et vues liées à la collecte de statistiques).
Une stratégie possible dans votre cas serait de supprimer le VIDE prévu, en gardant un œil sur cette vue et en vérifiant sur quelles tables le n_dead_tup
augmente considérablement. Ensuite, appliquez le VIDE agressif uniquement sur ces tables. Ce sera une victoire s'il existe de grandes tables dont les lignes ne sont jamais supprimées ni mises à jour et que le VACUUM agressif n'est vraiment nécessaire que sur les tables plus petites.
Mais continuez à exécuter l'ANALYSE pour que l'optimiseur ait toujours de nouvelles statistiques.
Je ne vois rien dans votre question dont autovacuum
ne s'occupe pas. Cela dépend en grande partie du modèle de vos activités d'écriture . Vous mentionnez 3 millions nouveau lignes par semaine, mais INSERT
(ou COPY
) ne créent généralement pas de ballonnement de table et d'index. (autovacuum
ne doit prendre en charge que statistiques de colonne , carte de visibilité et quelques travaux mineurs). UPDATE
et DELETE
sont la cause dominante du ballonnement des tables et des index, en particulier lors du ciblage de lignes aléatoires. Je ne vois rien de tout 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 jeter un œil aux autovacuum
settings . Si l'aspiration a tendance à interférer avec votre charge de travail, jetez également un œil à "Délai de vide basé sur les coûts" . L'aspiration manuelle devrait être la rare exception.
Si vous avez beaucoup de UPDATE
s aléatoires, vous souhaiterez peut-être définir FILLFACTOR
sur une valeur inférieure à 100, pour autoriser les mises à jour HOT tout de suite et réduire le besoin de VACUUM
. Plus d'informations sur les mises à jour HOT:
Notez également que les tables temporaires nécessitent un manuel VACUUM
& ANALYZE
. Je cite le manuel sur CREATE TABLE
:
Le démon autovacuum ne peut pas accéder et ne peut donc pas vider ou analyser des tables temporaires. Pour cette raison, des opérations de mise sous vide et d'analyse appropriées doivent être effectuées via les commandes SQL de session. Par exemple, si une table temporaire doit être utilisée dans des requêtes complexes, il est judicieux d'exécuter
ANALYZE
sur la table temporaire après son remplissage.
Bien que je convienne qu'il est préférable d'utiliser les fonctionnalités automatiques au lieu de l'exécuter à l'échelle de la base de données, dans la plupart des cas, le réglage par table est nécessaire.
Je ne suis pas tout à fait d'accord avec le choix de conception des postgres pour relier le vide et l'analyse, j'ai vu plusieurs cas où les bases de données qui font beaucoup d'insertion/mise à jour mais peu de suppression ne sont jamais analysées et commencent à mal fonctionner.
La solution consiste à entrer dans les tableaux qui sont largement utilisés et qui sont soumis à de grandes requêtes et à définir les paramètres d'analyse automatique de ces tableaux à quelque chose à l'endroit où ils sont analysés une fois ou tous les deux jours.
Vous pouvez accéder aux paramètres par table dans l'interface graphique de l'onglet de vide automatique et vous y verrez analyser les paramètres que vous pouvez définir indépendamment du vide.
Les paramètres se retrouvent dans le tableau des réoptions et peuvent être vus avec la requête
SELECT c.relname, c.reloptions FROM pg_class c where reloptions is not null
et une valeur d'échantillon d'une analyse agressive pourrait être
{autovacuum_enabled=true,autovacuum_analyze_threshold=10,autovacuum_analyze_scale_factor=.01}
Pour voir quand la dernière fois que vos tables ont été analysées automatiquement
select
relname,
n_dead_tup,
n_tup_ins,
n_tup_upd,
n_tup_del,
last_autoanalyze,
autoanalyze_count
from pg_stat_user_tables
where last_autoanalyze is not null
order by last_autoanalyze desc;