Istnieją trzy sposoby na uzyskanie tego rodzaju liczby, każdy z własnymi kompromisami.
Jeśli chcesz uzyskać prawdziwą liczbę, musisz wykonać instrukcję SELECT, taką jak ta, której użyłeś dla każdej tabeli. Dzieje się tak, ponieważ PostgreSQL przechowuje informacje o widoczności wierszy w samym wierszu, a nie nigdzie indziej, więc każda dokładna liczba może dotyczyć tylko jakiejś transakcji. Otrzymujesz liczbę tego, co ta transakcja widzi w momencie wykonania. Mógłbyś to zautomatyzować, aby działał z każdą tabelą w bazie danych, ale prawdopodobnie nie potrzebujesz takiego poziomu dokładności ani nie chcesz czekać tak długo.
Drugie podejście zwraca uwagę, że moduł zbierający statystyki śledzi z grubsza, ile wierszy jest „aktywnych” (nie usuniętych ani przestarzałych przez późniejsze aktualizacje) w dowolnym momencie. Ta wartość może nieco się różnić przy dużej aktywności, ale generalnie jest to dobre oszacowanie:
SELECT schemaname,relname,n_live_tup
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
Może to również pokazać, ile wierszy jest martwych, co samo w sobie jest interesującą liczbą do monitorowania.
Trzecim sposobem jest zauważenie, że polecenie systemowe ANALYZE, które jest regularnie wykonywane przez proces autovacuum od PostgreSQL 8.3 w celu aktualizacji statystyk tabeli, również oblicza oszacowanie wiersza. Możesz go złapać w ten sposób:
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;
Trudno powiedzieć, które z tych zapytań jest lepsze. Zwykle podejmuję tę decyzję w oparciu o to, czy jest więcej przydatnych informacji, których chcę również użyć wewnątrz pg_class lub wewnątrz pg_stat_user_tables. Do podstawowych celów liczenia, aby zobaczyć, jak duże są ogólnie rzeczy, obie powinny być wystarczająco dokładne.