Bu tür bir sayımı elde etmenin üç yolu vardır, her birinin kendi ödünleşimi vardır.
Gerçek bir sayı istiyorsanız, SELECT deyimini her tablo için kullandığınız gibi yürütmeniz gerekir. Bunun nedeni, PostgreSQL'in satır görünürlük bilgilerini başka hiçbir yerde değil, satırda tutmasıdır, bu nedenle doğru sayım yalnızca bazı işlemlerle ilişkili olabilir. İşlemin yürütüldüğü sırada gördüğü işlemlerin sayısını alırsınız. Veritabanındaki her tabloya karşı çalıştırmak için bunu otomatikleştirebilirsiniz, ancak muhtemelen bu doğruluk düzeyine ihtiyacınız yoktur veya bu kadar beklemek istemezsiniz.
İkinci yaklaşım, istatistik toplayıcının kabaca kaç satırın "canlı" olduğunu (sonraki güncellemelerle silinmediğini veya kullanılmadığını) izlediğini belirtir. Bu değer, ağır aktivite altında biraz düşebilir, ancak genellikle iyi bir tahmindir:
SELECT schemaname,relname,n_live_tup
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
Bu, kaç satırın öldüğünü de gösterebilir, bu da izlenecek ilginç bir sayıdır.
Üçüncü yol, tablo istatistiklerini güncellemek için PostgreSQL 8.3'ten itibaren otovakum işlemi tarafından düzenli olarak yürütülen sistem ANALYZE komutunun da bir satır tahmini hesapladığını not etmektir. Bunu böyle alabilirsin:
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;
Bu sorgulardan hangisinin daha iyi kullanıldığını söylemek zor. Normalde bu kararı, pg_class içinde mi yoksa pg_stat_user_tables içinde de kullanmak istediğim daha faydalı bilgilere dayanarak alırım. Temel sayma amacıyla, genel olarak ne kadar büyük şeylerin olduğunu görmek için, her ikisi de yeterince doğru olmalıdır.
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;