Woher weiß ich, ob die Statistiken einer Postgres-Tabelle aktuell sind?

8

Wenn in pgAdmin die Statistiken einer Tabelle nicht mehr aktuell sind, wird Folgendes angezeigt:

  

Ausführen von VACUUM empfohlen

     

Der geschätzte Zeilenzähler in der Tabelle schema.table weicht ab   signifikant von der tatsächlichen rowcount. Sie sollten VACUUM ANALYSE ausführen   auf diesem Tisch.

Ich habe es mit pgAdmin 3 und Postgres 8.4.4 getestet, mit autovacuum = off. Die Eingabeaufforderung wird sofort angezeigt, wenn ich auf eine Tabelle klicke, die geändert wurde.

Nehmen wir an, ich mache ein webbasiertes System in Java, wie kann ich feststellen, ob eine Tabelle veraltet ist, so dass ich eine Eingabeaufforderung wie die in pgAdmin anzeigen kann?

Aufgrund der Natur meiner Anwendung, sind hier ein paar Regeln, denen ich folgen muss:

  1. Ich möchte wissen, ob die Statistiken einer bestimmten Tabelle in pg_stats und pg_statistic aktuell sind.

  2. Ich kann das Autovacuum-Flag in postgresql.conf nicht setzen. (Mit anderen Worten, das Auto-Vacuum-Flag kann ein- oder ausgeschaltet sein. Ich habe keine Kontrolle darüber. Ich muss sagen, ob die Statistiken aktuell sind, ob das Autovakuum-Flag ein- oder ausgeschaltet ist.)

  3. Ich kann nicht jedes Mal Vakuum / Analyse durchführen, um es auf den neuesten Stand zu bringen.

  4. Wenn ein Benutzer eine Tabelle auswählt, muss ich die Eingabeaufforderung anzeigen, dass die Tabelle veraltet ist, wenn Aktualisierungen für diese Tabelle vorhanden sind (z. B. drop, insert und update), die nicht in pg_stats und pg_statistic angezeigt werden .

Es scheint, dass es nicht möglich ist, Zeitstempel in pg_catalog.pg_stat_all_tables zu analysieren. Wenn eine Tabelle noch nicht analysiert wurde, kann ich natürlich in last_analyze prüfen, ob ein Zeitstempel vorhanden ist, um festzustellen, ob die Tabelle aktuell ist. Mit dieser Methode kann ich jedoch nicht feststellen, ob die Tabelle aktuell ist, wenn bereits ein Zeitstempel vorhanden ist. Mit anderen Worten, unabhängig davon, wie viele Zeilen ich der Tabelle hinzufüge, ist der Zeitstempel last_analyze in pg_stat_all_tables immer für die erste Analyse (unter der Annahme, dass das Flag autovacuum ausgeschaltet ist). Daher kann ich zum ersten Mal nur die Aufforderung "Running VACUUM recommended" anzeigen.

Es ist auch nicht möglich, den last_analyze-Zeitstempel mit dem aktuellen Zeitstempel zu vergleichen. Möglicherweise gibt es seit Tagen keine Aktualisierungen für die Tabelle. Und es könnte in einer Stunde viele Updates geben.

Wie kann ich bei diesem Szenario immer feststellen, ob die Statistiken einer Tabelle aktuell sind?

    
Beibei 01.08.2011, 20:17
quelle

2 Antworten

12

Überprüfen Sie die Systemkataloge.

%Vor%

Alle Arten von nützlichen Informationen darin:

%Vor%     
Sean 01.08.2011 21:23
quelle
2

Sie sollten sich in Ihrer Bewerbung keine Sorgen machen müssen. Stattdessen sollten Sie den autovac -Prozess auf Ihrem Server konfiguriert haben (in postgresql.conf ), und der Server nimmt die Prozesse VACCUM und ANALYZE basierend auf seinen eigenen internen Statistiken. Sie können konfigurieren, wie oft es ausgeführt werden soll und wie die Schwellenwertvariablen verarbeitet werden sollen.

    
atrain 01.08.2011 20:59
quelle