PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie finden Sie die Zeilenanzahl für alle Ihre Tabellen in Postgres

Es gibt drei Möglichkeiten, diese Art von Zählung zu erhalten, jede mit ihren eigenen Kompromissen.

Wenn Sie eine wahre Zählung wünschen, müssen Sie die SELECT-Anweisung wie die ausführen, die Sie für jede Tabelle verwendet haben. Dies liegt daran, dass PostgreSQL die Zeilensichtbarkeitsinformationen in der Zeile selbst speichert und nicht irgendwo anders, sodass eine genaue Zählung nur relativ zu einer Transaktion sein kann. Sie erhalten eine Zählung dessen, was diese Transaktion zum Zeitpunkt ihrer Ausführung sieht. Sie könnten dies so automatisieren, dass es für jede Tabelle in der Datenbank ausgeführt wird, aber Sie benötigen wahrscheinlich nicht dieses Maß an Genauigkeit oder möchten so lange warten.

Der zweite Ansatz stellt fest, dass der Statistiksammler ungefähr verfolgt, wie viele Zeilen zu jeder Zeit "live" sind (nicht gelöscht oder durch spätere Updates veraltet). Dieser Wert kann bei starker Aktivität etwas abweichen, ist aber im Allgemeinen eine gute Schätzung:

SELECT schemaname,relname,n_live_tup 
  FROM pg_stat_user_tables 
  ORDER BY n_live_tup DESC;

Das kann Ihnen auch zeigen, wie viele Zeilen tot sind, was selbst eine interessante Zahl zum Überwachen ist.

Die dritte Möglichkeit besteht darin, zu beachten, dass der Systembefehl ANALYZE, der ab PostgreSQL 8.3 regelmäßig vom Autovacuum-Prozess ausgeführt wird, um Tabellenstatistiken zu aktualisieren, auch eine Zeilenschätzung berechnet. Sie können diese wie folgt abrufen:

SELECT 
  nspname AS schemaname,relname,reltuples
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE 
  nspname NOT IN ('pg_catalog', 'information_schema') AND
  relkind='r' 
ORDER BY reltuples DESC;

Welche dieser Abfragen besser zu verwenden ist, ist schwer zu sagen. Normalerweise treffe ich diese Entscheidung basierend darauf, ob es nützlichere Informationen gibt, die ich auch innerhalb von pg_class oder innerhalb von pg_stat_user_tables verwenden möchte. Für einfache Zählzwecke, nur um zu sehen, wie groß die Dinge im Allgemeinen sind, sollte beides genau genug sein.