您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

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

Postgres 2022/1/1 18:51:48 有534人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶