Det finns tre sätt att få den här typen av räkning, var och en med sina egna avvägningar.
Om du vill ha en sann räkning måste du köra SELECT-satsen som den du använde mot varje tabell. Detta beror på att PostgreSQL behåller radsynlighetsinformation i själva raden, inte någon annanstans, så en korrekt räkning kan bara vara relativ till någon transaktion. Du får en räkning av vad transaktionen ser vid den tidpunkt då den utförs. Du kan automatisera detta så att det körs mot varje tabell i databasen, men du behöver förmodligen inte den nivån av noggrannhet eller vill vänta så länge.
Den andra metoden noterar att statistikinsamlaren spårar ungefär hur många rader som är "live" (inte raderade eller föråldrade av senare uppdateringar) när som helst. Detta värde kan sjunka en aning under hård aktivitet, men är generellt sett en bra uppskattning:
SELECT schemaname,relname,n_live_tup
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
Det kan också visa dig hur många rader som är döda, vilket i sig är ett intressant antal att övervaka.
Det tredje sättet är att notera att systemets ANALYSE-kommando, som exekveras av autovakuumprocessen regelbundet från och med PostgreSQL 8.3 för att uppdatera tabellstatistik, också beräknar en raduppskattning. Du kan ta den så här:
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;
Vilken av dessa frågor som är bättre att använda är svårt att säga. Normalt fattar jag det beslutet baserat på om det finns mer användbar information som jag också vill använda inuti pg_class eller inuti pg_stat_user_tables. För grundläggande räkningsändamål, bara för att se hur stora saker är i allmänhet, bör båda vara tillräckligt korrekta.