admin

你如何在 Postgres 中找到所有表的行数

sql

我正在寻找一种方法来查找 Postgres 中所有表的行数。我知道我可以一次完成一张桌子:

SELECT count(*) FROM table_name;

但我想查看所有表的行数,然后按它排序以了解我所有的表有多大。


阅读 327

收藏
2021-07-01

共1个答案

admin

有三种方法可以获得这种计数,每种方法都有自己的权衡。

如果你想要一个真正的计数,你必须像你对每个表使用的那样执行 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 中使用来做出决定。出于基本的计数目的,只是为了查看一般事物有多大,两者都应该足够准确。

2021-07-01