Il y a trois façons d'obtenir ce genre de compte, chacune ayant ses propres inconvénients.
Si vous voulez un compte réel, vous devez exécuter l'instruction SELECT comme celle que vous avez utilisée pour chaque table. Ceci est dû au fait que PostgreSQL conserve les informations de visibilité de la ligne dans la ligne elle-même, pas ailleurs, donc tout comptage précis ne peut être que relatif à une transaction. Vous obtenez un compte de ce que cette transaction voit au moment où elle s'exécute. Vous pourriez automatiser cette opération pour l'exécuter sur chaque table de la base de données, mais vous n'avez probablement pas besoin de ce niveau de précision ou ne voulez pas attendre aussi longtemps.
La deuxième approche consiste à noter que le collecteur de statistiques suit à peu près le nombre de lignes qui sont "vivantes" (non supprimées ou rendues obsolètes par des mises à jour ultérieures) à tout moment. Cette valeur peut être légèrement erronée en cas d'activité intense, mais elle constitue généralement une bonne estimation :
SELECT schemaname,relname,n_live_tup
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
Cela peut également vous montrer combien de lignes sont mortes, ce qui est en soi un chiffre intéressant à surveiller.
La troisième façon est de noter que la commande système ANALYZE, qui est exécutée par le processus autovacuum régulièrement à partir de PostgreSQL 8.3 pour mettre à jour les statistiques de la table, calcule également une estimation de rangée. Vous pouvez l'attraper comme ceci :
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;
Il est difficile de dire laquelle de ces requêtes est la meilleure à utiliser. Normalement, je prends cette décision en fonction des informations plus utiles que je souhaite utiliser dans pg_class ou dans pg_stat_user_tables. Pour des comptages de base, juste pour voir la taille des choses en général, l'un ou l'autre devrait être assez précis.