PostgreSQL 查询所有表行数的方法

一、快速估算(依赖统计信息)

1. 使用 pg_stat_user_tables

SELECT relname AS table_name, n_live_tup AS row_count
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
  • ✅ 速度最快
  • ⚠️ 数值来自统计信息,可能不精确

2. 使用 pg_class

SELECT relname AS table_name, reltuples::bigint AS row_count
FROM pg_class
WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public')
  AND relkind = 'r'
ORDER BY row_count DESC;
  • ✅ 速度极快,适合概览
  • ⚠️ 同样是估算值

二、精确统计(逐表 COUNT)

1. 创建函数(推荐,可复用)

CREATE OR REPLACE FUNCTION get_table_row_counts()
RETURNS TABLE(table_name text, row_count bigint) AS $$
DECLARE
    tbl text;
BEGIN
    FOR tbl IN 
        SELECT tablename FROM pg_tables WHERE schemaname = 'public'
    LOOP
        RETURN QUERY EXECUTE format('SELECT %L::text, COUNT(*)::bigint FROM %I', tbl, tbl);
    END LOOP;
END;
$$ LANGUAGE plpgsql;

-- 调用
SELECT * FROM get_table_row_counts();

2. 生成 SQL 脚本(临时使用)

SELECT 'SELECT ''' || tablename || ''' AS table_name, COUNT(*) AS row_count FROM "' || tablename || '" UNION ALL '
FROM pg_tables
WHERE schemaname = 'public';
  • 去掉最后一个 UNION ALL 后执行

三、选择建议

需求场景 推荐方法
快速看个大概 pg_stat_user_tablespg_class
需要精确值(如迁移核对) 创建函数逐表 COUNT
偶尔用一次,不想建函数 生成 SQL 脚本法

💡 注意:以上查询默认针对当前连接数据库的 public schema。如需其他 schema,修改 schemaname 条件即可。

posted @ 2026-07-02 09:28  栖木hy  阅读(29)  评论(0)    收藏  举报