Er zijn drie manieren om dit soort telling te krijgen, elk met hun eigen afwegingen.
Als je een echte telling wilt, moet je de SELECT-instructie uitvoeren zoals je die voor elke tabel hebt gebruikt. Dit komt omdat PostgreSQL de zichtbaarheidsinformatie van rijen in de rij zelf bewaart, niet ergens anders, dus een nauwkeurige telling kan alleen relatief zijn aan een transactie. U krijgt een telling van wat die transactie ziet op het moment dat deze wordt uitgevoerd. Je zou dit kunnen automatiseren zodat het tegen elke tabel in de database kan worden uitgevoerd, maar waarschijnlijk heb je dat niveau van nauwkeurigheid niet nodig of wil je zo lang wachten.
De tweede benadering merkt op dat de statistiekenverzamelaar ongeveer bijhoudt hoeveel rijen op enig moment "live" zijn (niet verwijderd of verouderd door latere updates). Deze waarde kan iets afwijken bij zware activiteit, maar is over het algemeen een goede schatting:
SELECT schemaname,relname,n_live_tup
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
Dat kan je ook laten zien hoeveel rijen dood zijn, wat zelf een interessant getal is om te controleren.
De derde manier is om op te merken dat het systeem ANALYZE-commando, dat vanaf PostgreSQL 8.3 regelmatig wordt uitgevoerd door het autovacuumproces om tabelstatistieken bij te werken, ook een rijschatting berekent. Je kunt die zo pakken:
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;
Welke van deze query's het beste is om te gebruiken, is moeilijk te zeggen. Normaal gesproken neem ik die beslissing op basis van of er meer nuttige informatie is die ik ook wil gebruiken in pg_class of in pg_stat_user_tables. Voor basisteldoeleinden, gewoon om te zien hoe groot de dingen in het algemeen zijn, moeten beide nauwkeurig genoeg zijn.