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_tables 或 pg_class |
| 需要精确值(如迁移核对) | 创建函数逐表 COUNT |
| 偶尔用一次,不想建函数 | 生成 SQL 脚本法 |
💡 注意:以上查询默认针对当前连接数据库的
publicschema。如需其他 schema,修改schemaname条件即可。

浙公网安备 33010602011771号