统计信息函数
PostgreSQL 同时维护运行时累计统计和供优化器估计的表/列统计。前者帮助观察工作负载,后者帮助估算查询计划;它们不是精确、实时的业务计数。
活动和表统计
SELECT pid, state, wait_event_type, query
FROM pg_stat_activity
WHERE datname = current_database();
SELECT relname, seq_scan, idx_scan, n_live_tup, n_dead_tup
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;
pg_stat_activity 展示连接当前状态;其他用户的查询文本可因权限而不可见。pg_stat_user_tables 的顺序扫描、索引扫描、活行和死行数是累计值或估计值;n_live_tup 不能代替 SELECT count(*) 做精确业务统计。统计计数可能滞后,在同一事务中多次读取还受统计快照缓存影响。
函数与优化器统计
SELECT pg_stat_get_live_tuples('public.orders'::regclass),
pg_stat_get_dead_tuples('public.orders'::regclass);
SELECT tablename, attname, null_frac, n_distinct
FROM pg_stats
WHERE schemaname = 'public' AND tablename = 'orders';
pg_stat_get_live_tuples 等底层函数接收关系 OID;统计视图通常更易读。pg_stats 暴露分析得到的列分布估计,例如空值比例、不同值数量和常见值。ANALYZE 更新优化器统计,自动清理也可能触发分析;它不等于精确重算每个查询结果。
正确诊断
判断某个查询是否用索引,应结合 EXPLAIN (ANALYZE, BUFFERS) 与具体查询,而不是只看累计的 idx_scan。EXPLAIN ANALYZE 会实际执行语句,分析写操作时应先评估副作用。统计重置会改变累计基线,监控必须记录采样时间与重置时间;不同 PostgreSQL 版本的视图列和权限可能变化,应按目标版本核对。