Existují tři způsoby, jak získat tento druh počítání, z nichž každý má své vlastní kompromisy.
Pokud chcete skutečný počet, musíte provést příkaz SELECT jako ten, který jste použili u každé tabulky. Je to proto, že PostgreSQL uchovává informace o viditelnosti řádku v samotném řádku, nikoli nikde jinde, takže jakýkoli přesný počet může být relativní pouze k nějaké transakci. Získáváte počet toho, co tato transakce vidí v okamžiku, kdy se provádí. Můžete to zautomatizovat, aby se spouštělo proti každé tabulce v databázi, ale pravděpodobně nepotřebujete takovou úroveň přesnosti nebo chcete čekat tak dlouho.
Druhý přístup poznamenává, že sběrač statistik sleduje, kolik řádků je v každém okamžiku „aktivních“ (nevymazáno nebo zastaralých pozdějšími aktualizacemi). Tato hodnota může být při velké aktivitě o něco nižší, ale obecně jde o dobrý odhad:
SELECT schemaname,relname,n_live_tup
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
To vám také může ukázat, kolik řádků je mrtvých, což je samo o sobě zajímavé číslo ke sledování.
Třetím způsobem je poznamenat, že systémový příkaz ANALYZE, který je od PostgreSQL 8.3 pravidelně spouštěn procesem autovakuování pro aktualizaci statistik tabulky, také počítá odhad řádku. Můžete to vzít takto:
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;
Který z těchto dotazů je lepší použít, těžko říct. Normálně se rozhoduji na základě toho, zda existují užitečnější informace, které chci také použít uvnitř třídy pg_class nebo uvnitř pg_stat_user_tables. Pro základní účely počítání, abyste viděli, jak velké věci jsou obecně, by měly být obě dostatečně přesné.