Es gibt drei Möglichkeiten, diese Art von Zählung zu erhalten, jede mit ihren eigenen Nachteilen.
Wenn Sie eine echte Zählung wünschen, müssen Sie die SELECT-Anweisung wie diejenige, die Sie für jede Tabelle verwendet haben, ausführen. Das liegt daran, dass PostgreSQL Informationen über die Sichtbarkeit von Zeilen in der Zeile selbst und nirgendwo sonst speichert, so dass eine genaue Zählung nur relativ zu einer Transaktion erfolgen kann. Sie erhalten eine Zählung dessen, was diese Transaktion zu dem Zeitpunkt sieht, zu dem sie ausgeführt wird. Sie könnten dies automatisieren, um jede Tabelle in der Datenbank zu überprüfen, aber wahrscheinlich brauchen Sie diese Genauigkeit nicht oder wollen nicht so lange warten.
WITH tbl AS
(SELECT table_schema,
TABLE_NAME
FROM information_schema.tables
WHERE TABLE_NAME not like 'pg_%'
AND table_schema in ('public'))
SELECT table_schema,
TABLE_NAME,
(xpath('/row/c/text()', query_to_xml(format('select count(*) as c from %I.%I', table_schema, TABLE_NAME), FALSE, TRUE, '')))[1]::text::int AS rows_n
FROM tbl
ORDER BY rows_n DESC;
Der zweite Ansatz sieht vor, dass der Statistik-Collector grob erfasst, wie viele Zeilen zu jedem Zeitpunkt "live" sind (nicht gelöscht oder durch spätere Aktualisierungen überholt). Dieser Wert kann bei hoher Aktivität ein wenig 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 an sich schon eine interessante Zahl zur Überwachung ist.
Die dritte Möglichkeit ist, dass der Systembefehl ANALYZE, der seit PostgreSQL 8.3 regelmäßig vom Autovacuum-Prozess ausgeführt wird, um die Tabellenstatistiken zu aktualisieren, ebenfalls 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 geeignet ist, ist schwer zu sagen. Normalerweise treffe ich diese Entscheidung danach, 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 grundlegende Zählungszwecke, um zu sehen, wie groß die Dinge im Allgemeinen sind, sollten beide genau genug sein.