PostgreSQL 的统计信息

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 自动收集流程

是 否 数据修改 更新pg_class.reltuples 达到阈值? 触发autovacuum analyze 继续监控 收集列统计信息 更新pg_statistic

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 查询优化示例

sql 复制代码
-- 查看统计信息如何影响计划
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 性能问题诊断

sql 复制代码
-- 识别统计信息不准导致的性能问题
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 手动维护命令

sql 复制代码
-- 更新单个表统计信息
ANALYZE VERBOSE table_name;

-- 更新整个数据库
ANALYZE;

-- 带采样率的ANALYZE
ANALYZE table_name (sample_percent 20);

-- 创建扩展统计
CREATE STATISTICS stts1 (dependencies) ON col1, col2 FROM table1;

4.2 自动化维护方案

bash 复制代码
# 每日维护脚本示例
#!/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 表达式统计

sql 复制代码
-- 为计算列创建统计
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 多变量统计

sql 复制代码
-- 创建列依赖统计
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 监控查询示例

sql 复制代码
-- 统计信息时效性监控
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 统计信息可视化

bash 复制代码
# 生成统计报告示例
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 的统计信息系统为数据库性能优化提供了坚实基础。通过合理配置统计参数、定期维护统计信息,并利用扩展统计功能,可以显著提升复杂查询的性能。建议在以下场景特别注意统计信息管理:

  1. 数据仓库环境 :增大default_statistics_target并创建扩展统计
  2. OLTP高频更新表 :降低autovacuum_analyze_scale_factor
  3. 报表生成前:手动执行ANALYZE确保统计准确
  4. 模式变更后:立即更新相关统计信息

统计信息的质量直接影响查询优化器的决策质量,应将其作为数据库日常维护的重要组成部分。

谨记:心存敬畏,行有所止。

相关推荐
Vcaker12 分钟前
Linux学习36-k8s集群升级及kube-vip高可用
linux·运维·学习
adinnet202622 分钟前
多轮对话与上下文压缩:追问时模型怎么记住前面说的
数据库·microsoft
wdfk_prog27 分钟前
Wi-Fi Direct教程 02:从 wpa_cli main() 到 P2P_FIND——用源码注释追踪 CLI 控制命令发送
运维·服务器·网络·网络协议·ubuntu·p2p·wifi-direct
JosieBook1 小时前
【数据库】MySQL 实战精通系列 · 第11篇:Redis 缓存与 MySQL 一致性实战
数据库·mysql·缓存
HRTOS1 小时前
HRTOS Shell继续完善:优化printf缓冲区与字符串越界保护,国庆后随新版本更新
运维·单片机·嵌入式硬件·算法·51单片机
智能RPA1 小时前
农业与矿业行业智能体自动化平台对比评测(计量与巡检场景)
运维·人工智能·python·自动化·agent·rpa
沫璃染墨1 小时前
《从零入门Linux系统篇(五十一):线程篇·四——pthread线程库详解:从线程创建到终止与分离》
linux·运维·服务器·开发语言·c++·系统架构·线程
墨家前任巨子1 小时前
定时关机脚本
运维
ESDWAN1 小时前
企业组网后网络频繁掉线,常见故障排查指南
运维·网络·架构
Leo.yuan1 小时前
2026企业级数据集成平台市场报告:国内外厂商格局与技术路线
数据库·oracle