我正在寻找一种方法来查找 Postgres 中所有表的行数。我知道我可以一次完成一张桌子:
SELECT count(*) FROM table_name;
但我想查看所有表的行数,然后按它排序以了解我所有的表有多大。
有三种方法可以获得这种计数,每种方法都有自己的权衡。
如果你想要一个真正的计数,你必须像你对每个表使用的那样执行 SELECT 语句。这是因为 PostgreSQL 将行可见性信息保存在行本身中,而不是其他任何地方,因此任何准确的计数都只能与某个事务相关。您正在计算该事务在执行时看到的内容。您可以自动执行此操作以针对数据库中的每个表运行,但您可能不需要这种级别的准确性或想要等待那么长时间。
第二种方法指出,统计收集器随时大致跟踪有多少行是“活动的”(未被删除或被后续更新废弃)。这个值在大量活动下可能会稍微偏离,但通常是一个很好的估计:
SELECT schemaname,relname,n_live_tup FROM pg_stat_user_tables ORDER BY n_live_tup DESC;
这也可以显示有多少行已死,这本身就是一个值得监控的有趣数字。
第三种方法是注意系统 ANALYZE 命令,它从 PostgreSQL 8.3 开始由 autovacuum 进程定期执行以更新表统计信息,也计算行估计。你可以像这样抓住那个:
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 中使用来做出决定。出于基本的计数目的,只是为了查看一般事物有多大,两者都应该足够准确。