获取Postgres数据库中每个表的行数

11

如何最有效地获取数据库中所有表的行数?

我正在使用Postgres数据库。

示例结果

table_name     row_count
------------   -------------
some_table     1,234
foobar         5,678
another_table  32
... 

该表中的行数是多少... - Don P
1
请看这里:Postgres中的行数Postgres中的sysobjects - Hockenberry
谢谢@Hockenberry - 奇怪的是它在我的搜索结果中没有显示出来!我会关闭这个问题,但它已经有了一个答案。 - Don P
我正在使用这个工具,它有自己的命令来完成此操作。 - user330315
2个回答

17

如果你想要特定表格的行数,那么这个代码可以正常工作。

SELECT reltuples FROM pg_class WHERE oid = 'my_schema.my_table'::regclass;

reltuples 是 pg_class 表中的一列,它保存有关表中行数的数据。这仅是计划器使用的估计值。

如果您想要所有表格及其行数的列表,则可以使用它完成工作。

SELECT
  pgClass.relname   AS tableName,
  pgClass.reltuples AS rowCount
FROM
  pg_class pgClass
INNER JOIN
  pg_namespace pgNamespace ON (pgNamespace.oid = pgClass.relnamespace)
WHERE
  pgNamespace.nspname NOT IN ('pg_catalog', 'information_schema') AND
  pgClass.relkind='r'

"为什么"SELECT count(*) FROM bigtable;"很慢?" : count(*)


为什么要将 LEFT JOIN 改成 INNER JOIN? - Frank Heikens
请注意,在执行此命令之前,您可能需要在您的数据库上运行 ANALYZE 命令以获得正确的结果。对我来说,SELECT count(*) FROM table; 查询结果与表格实际情况存在差异,只有经过 ANALYZE 后才能够得出正确结果。 - wanaryytel

4

如果要获取整个数据库的总行数,请使用以下命令:

SELECT
  SUM(pgClass.reltuples) AS totalRowCount
FROM
  pg_class pgClass
LEFT JOIN
  pg_namespace pgNamespace ON (pgNamespace.oid = pgClass.relnamespace)
WHERE
  pgNamespace.nspname NOT IN ('pg_catalog', 'information_schema') AND
  pgClass.relkind='r'

特定数据库中的特定表行计数如下:
SELECT
  pgClass.relname   AS tableName,
  pgClass.reltuples AS rowCount
FROM
  pg_class pgClass
LEFT JOIN
  pg_namespace pgNamespace ON (pgNamespace.oid = pgClass.relnamespace)
WHERE
  pgNamespace.nspname NOT IN ('pg_catalog', 'information_schema') AND
  pgClass.relkind='r'

For reference here is the link


文档中提到的一个注意事项是:“这只是规划器使用的估计值。” - Richard Fearn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接