PostgreSQL 的统计信息
PostgreSQL 的统计信息是查询优化和性能调优的基础,系统通过多种统计信息来评估数据分布和访问模式,从而生成高效的执行计划。
一 统计信息类型与用途
1.1 核心统计类别
统计类型 | 存储位置 | 主要用途 | 更新机制 |
---|---|---|---|
表和索引扫描统计 | pg_stat_* 视图 |
查询计划优化 | 自动/手动ANALYZE |
系统性能统计 | pg_stat_* 视图 |
性能监控 | 实时更新 |
数据分布统计 | pg_statistic 目录 |
查询成本估算 | ANALYZE命令 |
扩展统计 | pg_statistic_ext |
复杂查询优化 | ANALYZE命令 |
1.2 关键统计视图对比
视图名称 | 统计内容 | 典型应用场景 |
---|---|---|
pg_stat_user_tables |
用户表访问统计 | 识别高频表 |
pg_stat_user_indexes |
索引使用情况 | 评估索引有效性 |
pg_stat_activity |
当前会话信息 | 会话监控 |
pg_stat_database |
数据库级统计 | 负载分析 |
二 统计信息收集机制
2.1 自动收集流程
2.2 统计收集参数配置
参数 | 默认值 | 调优建议 |
---|---|---|
default_statistics_target |
100 | 大表可增至200-500 |
autovacuum_analyze_scale_factor |
0.1 | 大表设为0.01-0.05 |
autovacuum_analyze_threshold |
50 | 结合scale_factor调整 |
stats_row_level |
on | 关键表建议开启 |
三 统计信息应用实例
3.1 查询优化示例
-- 查看统计信息如何影响计划
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 100;
-- 对比不同统计目标的效果
SET default_statistics_target = 10;
EXPLAIN ANALYZE...;
SET default_statistics_target = 500;
EXPLAIN ANALYZE...;
3.2 性能问题诊断
-- 识别统计信息不准导致的性能问题
SELECT relname, last_analyze, n_mod_since_analyze
FROM pg_stat_user_tables
WHERE n_mod_since_analyze > 1000;
-- 检查索引使用情况
SELECT schemaname, tablename, indexname, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan < 50
ORDER BY schemaname, tablename;
四 统计信息维护策略
4.1 手动维护命令
-- 更新单个表统计信息
ANALYZE VERBOSE table_name;
-- 更新整个数据库
ANALYZE;
-- 带采样率的ANALYZE
ANALYZE table_name (sample_percent 20);
-- 创建扩展统计
CREATE STATISTICS stts1 (dependencies) ON col1, col2 FROM table1;
4.2 自动化维护方案
# 每日维护脚本示例
#!/bin/bash
# 分析更新量大的表
psql -c "ANALYZE VERBOSE (SELECT table_name FROM pg_stat_user_tables
WHERE n_mod_since_analyze > 10000);"
# 每周全库分析
psql -c "ANALYZE VERBOSE;"
五 高级统计技术
5.1 表达式统计
-- 为计算列创建统计
CREATE STATISTICS expr_stats (expressions)
ON (substring(email, position('@' in email)+1))
FROM users;
-- 使用统计优化查询
EXPLAIN ANALYZE SELECT * FROM users
WHERE substring(email, position('@' in email)+1) = 'example.com';
5.2 多变量统计
-- 创建列依赖统计
CREATE STATISTICS dept_stats (dependencies)
ON department_id, manager_id FROM employees;
-- 创建MCV列表
CREATE STATISTICS mcv_stats (mcv)
ON status, priority FROM tickets;
六 统计信息监控
6.1 监控查询示例
-- 统计信息时效性监控
SELECT
schemaname,
relname,
last_analyze,
n_mod_since_analyze,
round(n_mod_since_analyze::numeric/reltuples::numeric*100,2) as change_percent
FROM pg_stat_user_tables
WHERE reltuples > 0
ORDER BY change_percent DESC;
-- 扩展统计使用情况
SELECT stxname, stxkeys, stxkind
FROM pg_statistic_ext
JOIN pg_namespace ON stxnamespace = pg_namespace.oid;
6.2 统计信息可视化
# 生成统计报告示例
psql -c "SELECT relname, seq_scan, idx_scan,
round(100*idx_scan::float/(seq_scan+idx_scan+1),2) as idx_scan_pct
FROM pg_stat_user_tables" -H -o stats_report.html
PostgreSQL 的统计信息系统为数据库性能优化提供了坚实基础。通过合理配置统计参数、定期维护统计信息,并利用扩展统计功能,可以显著提升复杂查询的性能。建议在以下场景特别注意统计信息管理:
- 数据仓库环境:增大
default_statistics_target
并创建扩展统计 - OLTP高频更新表:降低
autovacuum_analyze_scale_factor
- 报表生成前:手动执行ANALYZE确保统计准确
- 模式变更后:立即更新相关统计信息
统计信息的质量直接影响查询优化器的决策质量,应将其作为数据库日常维护的重要组成部分。
谨记:心存敬畏,行有所止。