この種のカウントを取得するには3つの方法があり、それぞれに独自のトレードオフがあります。
真のカウントが必要な場合は、各テーブルに対して使用したようなSELECTステートメントを実行する必要があります。これは、PostgreSQLが行の可視性情報を他の場所ではなく行自体に保持するため、正確なカウントは特定のトランザクションにのみ関連する可能性があるためです。そのトランザクションが実行された時点で見たもののカウントを取得しています。これを自動化してデータベース内のすべてのテーブルに対して実行することもできますが、おそらくそのレベルの精度は必要ないか、それほど長く待ちたくないでしょう。
2番目のアプローチでは、統計コレクターは、いつでも「ライブ」(削除されたり、後の更新によって廃止されたりしない)行の大まかな数を追跡することに注意してください。この値は、アクティビティが多い場合は少しずれることがありますが、一般的には適切な見積もりです:
SELECT schemaname,relname,n_live_tup
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
これにより、死んでいる行の数もわかります。これ自体、監視するのに興味深い数です。
3番目の方法は、テーブル統計を更新するためにPostgreSQL 8.3の時点で自動バキュームプロセスによって定期的に実行されるシステムANALYZEコマンドも、行の見積もりを計算することに注意することです。あなたはこのようにそれをつかむことができます:
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;
これらのクエリのどれを使用するのが良いかはわかりません。通常、私はpg_class内またはpg_stat_user_tables内で使用したいより有用な情報があるかどうかに基づいてその決定を行います。基本的なカウントの目的で、一般的にどれだけ大きいかを確認するために、どちらも十分に正確である必要があります。