Esistono tre modi per ottenere questo tipo di conteggio, ognuno con i propri compromessi.
Se vuoi un conteggio vero, devi eseguire l'istruzione SELECT come quella che hai usato contro ogni tabella. Questo perché PostgreSQL mantiene le informazioni sulla visibilità della riga nella riga stessa, non altrove, quindi qualsiasi conteggio accurato può essere relativo solo ad alcune transazioni. Stai ottenendo un conteggio di ciò che quella transazione vede nel momento in cui viene eseguita. Potresti automatizzarlo per l'esecuzione su tutte le tabelle del database, ma probabilmente non hai bisogno di quel livello di precisione o vuoi aspettare così a lungo.
Il secondo approccio rileva che il raccoglitore di statistiche tiene traccia approssimativamente di quante righe sono "attive" (non eliminate o obsolete da aggiornamenti successivi) in qualsiasi momento. Questo valore può essere leggermente inferiore in condizioni di intensa attività, ma in genere è una buona stima:
SELECT schemaname,relname,n_live_tup
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
Questo può anche mostrarti quante righe sono morte, che è di per sé un numero interessante da monitorare.
Il terzo modo è notare che il comando ANALYZE del sistema, che viene eseguito regolarmente dal processo di autovacuum a partire da PostgreSQL 8.3 per aggiornare le statistiche delle tabelle, calcola anche una stima di riga. Puoi prenderlo in questo modo:
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;
Quale di queste query sia meglio usare è difficile da dire. Normalmente prendo questa decisione in base al fatto che ci siano informazioni più utili che voglio usare anche all'interno di pg_class o all'interno di pg_stat_user_tables. Ai fini del conteggio di base, solo per vedere quanto sono grandi le cose in generale, entrambi dovrebbero essere sufficientemente precisi.