Comment puis-je savoir si les statistiques d'un Postgres table sont à jour?
Dans pgAdmin, chaque fois qu'un tableau des statistiques de l'out-of-date, il demande:
De VIDE recommandé
L'estimation du nombre de lignes sur le schéma de la table.le tableau s'écarte
de manière significative à partir du nombre réel de lignes. Vous devez exécuter le VIDE ANALYSER
sur cette table.
Je l'ai testé à l'aide de pgAdmin 3 et Postgres 8.4.4, avec autovacuum=off. L'invite s'affiche immédiatement à chaque fois que je clique sur une table qui a été changé.
Disons que je suis en train de faire un système basé sur le web en Java, comment puis-je détecter si une table est out-of-date, afin que je puisse afficher une invite comme dans pgAdmin?
En raison de la nature de ma demande, voici quelques règles que j'ai à suivre:
-
Je veux savoir si les statistiques d'une table dans pg_stats et pg_statistic sont à jour.
-
Je ne peux pas définir l'autovacuum drapeau dans postgresql.conf. (En d'autres termes, l'autovacuum drapeau peut être allumé ou éteint. Je n'ai aucun contrôle sur elle. J'ai besoin de savoir si les stats sont à jour si l'autovacuum drapeau est sur on ou off.)
-
Je ne peux pas fonctionner à vide/analyser tous les temps pour le faire jusqu'à ce jour.
-
Lorsqu'un utilisateur sélectionne une table, j'ai besoin d'afficher l'invite à la table est obsolète quand il y a des mises à jour de ce tableau (telles que la suppression, l'insertion et mise à jour) qui ne sont pas reflétés dans pg_stats et pg_statistic.
Il semble qu'il n'est pas possible par l'analyse des horodateurs dans pg_catalog.pg_stat_all_tables. Bien sûr, si une table n'a pas été analysés avant, je peux vérifier si il a un timestamp dans last_analyze à savoir si le tableau est à jour. En utilisant cette méthode, cependant, je ne peut pas détecter si le tableau est à jour quand il y a déjà un horodatage. En d'autres termes, n'importe comment beaucoup de lignes-je ajouter à la table, son last_analyze timestamp dans pg_stat_all_tables est toujours la première à analyser (en supposant que l'autovacuum indicateur est éteint). Par conséquent, je ne peux montrer le "VIDE recommandé" invite pour la première fois.
Il n'est également pas possible en comparant les last_analyze horodatage l'horodatage actuel. Il n'y a pas de mises à jour de la table pendant des jours. Et il pourrait y avoir des tonnes de mises à jour en une heure.
Compte tenu de ce scénario, la façon dont je peux toujours dire que si les données d'une table sont à jour?
OriginalL'auteur Beibei | 2011-08-01
Vous devez vous connecter pour publier un commentaire.
Vérifier les catalogues système.
Toutes sortes d'informations utiles dans:
Ok j'ai trouvé comment dire si les statistiques d'une table sont à jour quand il y a des lignes ajoutées ou supprimées à partir de) la table. Le truc, c'est de comparer les n_tup_ins (ou n_live_tup) en vue de "pg_catalog.pg_stat_all_tables" avec reltuples dans la table "pg_catalog.pg_class". Bien que cette méthode ne peut pas détecter les mises à jour lorsque le nombre de ligne qu'il conserve le même, il répond à mon problème.
Il suffit de se connecter à toutes les requêtes sur le serveur et voir ce qui se passe lorsque vous vous connectez avec pgAdmin. Veuillez noter que le commentaire ci-dessus à partir d'une autre affiche sur l'activation autovacuum. Vous devez exécuter avec autovacuum, sauf si vous avez quelques exceptionnellement exotiques besoins et de savoir précisément ce que vous essayez d'éviter à l'aide de autovacuum (les chances sont que vous n'avez pas et vous ne devriez pas être en évitant autovacuum). Si ce n'est pas votre décision, merci de faire de ce cas à celui qui est le décideur.
OriginalL'auteur Sean
Vous ne devriez pas avoir à vous soucier de vac pratiquent dans votre application. Au lieu de cela, vous devriez avoir la
autovac
processus configuré sur votre serveur (danspostgresql.conf
), et le serveur se prend deVACCUM
etANALYZE
processus sur la base de ses propres statistiques. Vous pouvez configurer la fréquence à laquelle il doit s'exécuter, et que le seuil de variables pour qu'il puisse traiter.Pouvez-vous entrer en contact avec votre DBA? Même si ses une application hébergée, la autovac démon doit être en cours d'exécution, en tant que Postgres peut devenir très fragmenté sans elle, surtout si vous faites beaucoup de suppressions.
OriginalL'auteur atrain