Są trzy sposoby, aby tego rodzaju liczyć, każdy z własnym kompromisów.
Jeśli chcesz mieć prawdziwą liczbę, musisz wykonać instrukcję SELECT, taką jak ta użyta w każdej tabeli. Dzieje się tak dlatego, że PostgreSQL zachowuje informacje o widoczności wiersza w samym wierszu, a nie w żadnym innym miejscu, więc dokładna liczba może być zależna tylko od transakcji. Dostajesz liczbę tego, co ta transakcja widzi w momencie jej wykonania. Możesz zautomatyzować to działanie w stosunku do każdej tabeli w bazie danych, ale prawdopodobnie nie potrzebujesz takiego poziomu dokładności lub chcesz tak długo czekać.
Drugie podejście zauważa, że kolektor statystyk śledzi w przybliżeniu, ile wierszy jest "na żywo" (nie usuniętych lub nieaktualnych w późniejszych aktualizacjach) w dowolnym momencie. Wartość ta może być wyłączona przez trochę pod ciężkim aktywności, ale jest na ogół dobre oszacowanie:
SELECT schemaname,relname,n_live_tup
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
To może również pokazać, jak wiele wierszy są martwe, który jest sam w sobie ciekawy numer monitorować.
Trzeci sposób polega na tym, że polecenie ANALYZE systemu, które jest wykonywane przez proces autovacuum regularnie od PostgreSQL 8.3 w celu aktualizacji statystyk tabeli, również oblicza oszacowanie rzędu. Możesz go pobrać w następujący 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;
Które z tych zapytań jest lepsze w użyciu, trudno powiedzieć. Zwykle podejmuję tę decyzję w oparciu o to, czy jest więcej przydatnych informacji, które również chcę użyć w klasie pg_class lub wewnątrz pg_stat_user_tables. W przypadku podstawowych obliczeń, aby zobaczyć, jak duże rzeczy są w ogóle, albo powinny być wystarczająco dokładne.
Próbowałem tego używać, ale dane są dość nieaktualne. – mlissner
@mlissner: Jeśli twój automatyczny interwał jest zbyt długi lub nie uruchomiłeś instrukcji "ANALIZA" na stole, statystyki mogą odejść. Jest to kwestia obciążenia bazy danych i konfiguracji bazy danych (jeśli statystyki są aktualizowane częściej, statystyki będą dokładniejsze, ale może to zmniejszyć wydajność środowiska wykonawczego). Ostatecznie, jedynym sposobem uzyskania dokładnych danych jest uruchomienie 'select count (*) from table' dla wszystkich tabel. – ig0774
właśnie wypróbował to i NIE jest właściwą odpowiedzią. –