Existem três maneiras de obter esse tipo de contagem, cada uma com suas próprias vantagens e desvantagens.
Se você deseja uma contagem verdadeira, é necessário executar a instrução SELECT como a que você usou em cada tabela. Isso ocorre porque o PostgreSQL mantém as informações de visibilidade da linha na própria linha, e não em nenhum outro lugar; portanto, qualquer contagem precisa pode ser relativa apenas a alguma transação. Você está obtendo uma contagem do que essa transação vê no momento em que é executada. Você pode automatizar isso para executar em todas as tabelas do banco de dados, mas provavelmente não precisa desse nível de precisão ou deseja esperar tanto tempo.
A segunda abordagem observa que o coletor de estatísticas rastreia aproximadamente quantas linhas estão "ativas" (não excluídas ou obsoletas por atualizações posteriores) a qualquer momento. Esse valor pode ser um pouco baixo em atividades pesadas, mas geralmente é uma boa estimativa:
SELECT schemaname,relname,n_live_tup
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
Isso também pode mostrar quantas linhas estão mortas, o que é um número interessante para monitorar.
A terceira maneira é observar que o comando ANALYZE do sistema, que é executado pelo processo de autovacuum regularmente a partir do PostgreSQL 8.3 para atualizar as estatísticas da tabela, também calcula uma estimativa de linha. Você pode pegar esse assim:
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;
Qual dessas consultas é melhor usar é difícil dizer. Normalmente, tomo essa decisão com base em informações mais úteis que também quero usar dentro de pg_class ou dentro de pg_stat_user_tables. Para propósitos básicos de contagem, apenas para ver em que medida as coisas são grandes em geral, devem ser suficientemente precisas.
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 3 DESC;