PostgreSQL 如何查看所有表实际的记录数量/数据条数

通过创建存储过程,统计数据库中所有用户表的行数。

CREATE OR REPLACE FUNCTION count_all_tables()
RETURNS TABLE (table_name TEXT, exact_rows BIGINT) AS $$
DECLARE
  cur REFCURSOR;
  qry TEXT;
  tbl TEXT;
  cnt BIGINT;
BEGIN
  OPEN cur FOR 
    SELECT FORMAT(
      'SELECT %L::TEXT, COUNT(*)::BIGINT FROM %I.%I',
      relname,
      schemaname,
      relname
    )
    FROM pg_stat_user_tables
    WHERE schemaname NOT IN ('pg_catalog', 'information_schema');
  
  LOOP
    FETCH cur INTO qry;
    EXIT WHEN NOT FOUND;
    
    BEGIN
      EXECUTE qry INTO tbl, cnt;
      table_name := tbl;
      exact_rows := cnt;
      RETURN NEXT;
    EXCEPTION WHEN others THEN
      RAISE WARNING '跳过表: %', SQLERRM;
    END;
  END LOOP;
  
  CLOSE cur;
END;
$$ LANGUAGE plpgsql;

SELECT * FROM count_all_tables();

函数解析

这个函数是一个 PostgreSQL 存储过程,用于统计数据库中所有用户表的行数。下面我将详细解释这个函数的各个部分:

函数定义

CREATE OR REPLACE FUNCTION count_all_tables()
RETURNS TABLE (table_name TEXT, exact_rows BIGINT) AS $$
  • CREATE OR REPLACE FUNCTION:创建或替换一个函数
  • count_all_tables():函数名称
  • RETURNS TABLE (table_name TEXT, exact_rows BIGINT):定义返回一个结果集,包含两列:表名(TEXT类型)和精确行数(BIGINT类型)

变量声明

DECLARE
  cur REFCURSOR;  -- 游标变量,用于遍历查询结果
  qry TEXT;       -- 存储动态生成的SQL查询
  tbl TEXT;       -- 临时存储表名
  cnt BIGINT;     -- 临时存储行数

主逻辑

1. 打开游标

OPEN cur FOR 
  SELECT FORMAT(
    'SELECT %L::TEXT, COUNT(*)::BIGINT FROM %I.%I',
    relname,
    schemaname,
    relname
  )
  FROM pg_stat_user_tables
  WHERE schemaname NOT IN ('pg_catalog', 'information_schema');

这部分代码:

  • 从系统视图pg_stat_user_tables获取所有用户表(排除系统表)
  • 使用FORMAT函数为每个表生成一个计数查询
  • %L%I是格式占位符,%L用于字符串字面量,%I用于标识符(如表名)
  • 生成的查询形如:SELECT '表名'::TEXT, COUNT(*)::BIGINT FROM 模式名.表名

2. 循环处理每个表

LOOP
  FETCH cur INTO qry;  -- 从游标获取下一条记录
  EXIT WHEN NOT FOUND; -- 如果没有更多记录则退出循环
  
  BEGIN
    EXECUTE qry INTO tbl, cnt;  -- 执行动态SQL
    table_name := tbl;          -- 设置返回的表名
    exact_rows := cnt;          -- 设置返回的行数
    RETURN NEXT;                -- 返回当前行
  EXCEPTION WHEN others THEN
    RAISE WARNING '跳过表: %', SQLERRM;  -- 如果出错则跳过并记录警告
  END;
END LOOP;

3. 清理资源

CLOSE cur;  -- 关闭游标

函数调用

SELECT * FROM count_all_tables();

调用该函数会返回一个结果集,包含数据库中所有用户表的名称和行数。

功能总结

这个函数的主要功能是:

  1. 查询数据库中所有用户表(排除系统表)
  2. 为每个表动态生成并执行一个COUNT(*)查询
  3. 返回表名和对应的行数
  4. 如果某个表无法统计(如权限问题),会跳过并记录警告而不是终止整个操作

这种动态SQL技术在处理需要遍历多个表的场景中非常有用,特别是在需要获取数据库元信息或执行批量操作时。

### 查询 PostgreSQL 数据行数 对于希望了解 PostgreSQL 数据库中特定的行数情况,存在多种方式来实现这一目标。 一种较为高效的方法是利用 `pg_class` 系统目录中的 `reltuples` 字段获取估计的行数。这可以通过执行如下 SQL 语句完成: ```sql SELECT reltuples::bigint AS EstimatedCount FROM pg_class WHERE oid = 'public.TableName'::regclass; ``` 此方法提供了一个近似的行数统计结果,并且性能较好[^1]。 然而,当追求更高的准确性时,则需采用标准的 `COUNT(*)` 函数来进行确切计算。尽管这种方式可能较慢,特别是针对大型格而言,但它能给出绝对准确的结果。具体的查询语法如下所示: ```sql SELECT COUNT(*) FROM public.TableName; ``` 值得注意的是,在某些情况下,为了提高效率并接受一定程度上的误差,还可以考虑定期运行 VACUUM 命令更新 `pg_class.reltuples` 的值,从而使得基于该字段得出的预估更加贴近实际状况[^3]。 另外,若要一次性查看整个数据库内所有用户定义的大致行数分布,可运用更复杂的联合查询操作: ```sql SELECT relname, reltuples FROM pg_class CLS LEFT JOIN pg_namespace N ON (N.oid = CLS.relnamespace) WHERE nspname NOT IN ('pg_catalog', 'information_schema') AND relkind = 'r' ORDER BY reltuples DESC; ``` 上述命令不仅限于单一,而是适用于除系统自带之外的所有普通关系型对象[^4]。 最后,如果仅是为了检索满足特定条件的部分记录条目数量,那么可以在 `SELECT ... WHERE...` 结构后面附加相应的过滤达式以限定范围[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python454

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值