我正在寻找一种方法来查找Postgres中所有表的行数。我知道我可以通过以下方式一次完成一张桌子:
从表名称中选择计数(*);
但是我想看看所有表的行数,然后按它排序,以了解我所有的表有多大
有三种方法可以获得这种计数,每种方法都有自己的权衡
如果需要一个真计数,则必须执行SELECT语句,就像对每个表使用的语句一样。这是因为PostgreSQL将行可见性信息保存在行本身中,而不是保存在其他任何位置,因此任何精确的计数只能与某个事务相关。您将获得该事务在执行时所看到的内容的计数。您可以对数据库中的每个表自动执行此操作,但您可能不需要这样的精度级别,也不想等待那么长时间
第二种方法注意到,统计数据采集器在任何时候都大致跟踪有多少行是“活动的”(没有被删除或被以后的更新淘汰)。在活动量大的情况下,该值可能会有点偏离,但通常是一个很好的估计值:
选择schemaname、relname、n\u live\u tup
从pg_stat_user_表
由n_live_tup DESC订购;
这还可以显示死行数,这本身就是一个需要监控的有趣数字
第三种方法是注意,系统分析命令(从PostgreSQL 8.3开始由autovacuum进程定期执行以更新表统计信息)也会计算行估计值。你可以像这样抓住它:
选择
nspname作为schemaname、relname、reltuple
来自pg_C类
左连接pg_命名空间N打开(N.oid=C.relnamespace)
哪里
nspname不在(‘pg_目录’、‘信息_架构’)中,并且
relkind='r'
按重元组顺序描述;
很难说哪种查询更适合使用。通常,我会根据pg_类内部还是pg_stat_user_表内部是否还有更有用的信息来做出决定。为了基本的计算目的,只是为了看看一般情况下事情有多大,两者都应该足够准确