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:

  1. Je veux savoir si les statistiques d'une table dans pg_stats et pg_statistic sont à jour.

  2. 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.)

  3. Je ne peux pas fonctionner à vide/analyser tous les temps pour le faire jusqu'à ce jour.

  4. 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