PostgreSQL 性能诊断
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,将 @user_3c6cb52e/postgresql-performance-diagnostics 安装到你的 AI 助手中。
技能介绍
要解决什么问题
线上 PostgreSQL 常见的三类性能故障往往互相掩盖:少数几条 SQL 吃掉大量 CPU;某张大表缺少合适索引而退化为顺序扫描;某个长事务或锁等待拖住整个连接池。只看应用日志很难区分这三者,而一旦打开 pg_stat_statements、pg_stat_user_tables 等系统视图,线索又分散在多个地方,需要人工拼凑。
技能如何工作
PostgreSQL 性能诊断 把分析流程组织在系统统计视图周围:
- 慢查询归因:读取
pg_stat_statements的执行统计,按总耗时或调用次数排序,找出真正昂贵的语句,而不是只看平均耗时。 - 表级行为:结合
pg_stat_user_tables观察扫描方式、元组读写与死元组情况,判断是否出现全表扫描或高频更新。 - 执行计划核对:对候选语句跑
EXPLAIN ANALYZE,把计划里各节点的实际耗时与统计视图的结论相互印证。 - 索引缺口识别:通过
pg_stat_user_indexes检查索引使用情况,找出从未被命中或明显缺失的索引。 - 锁竞争检测:联动
pg_locks与pg_stat_activity,定位持锁等待的会话及其阻塞链。
底层依赖 Node.js 的非阻塞 PostgreSQL 客户端 node-postgres,纯 JavaScript 实现,可选原生 libpq 绑定。
适用边界与注意点
pg_stat_statements需要在库中安装相应扩展,统计是累计值,重启后归零,对比时要先确定时间窗口。- 索引建议来自统计信息推导,仍需用
EXPLAIN验证,避免盲目加索引拖慢写入。 - 锁分析只是当前时刻的快照,间歇性阻塞需要多次采样才能抓到。
- 结论的精度依赖统计视图捕获的样本量,短查询或低频语句可能不足以支撑判断。
使用场景
- 在排查线上 SQL 变慢时,需要按总耗时从 pg_stat_statements 找出最贵的几条语句。
- 发现查询不走索引、IO 变高,需要结合 pg_stat_user_tables 与 EXPLAIN ANALYZE 判断全表扫描原因。
- 数据库连接堆积时,需要用 pg_locks 与 pg_stat_activity 找出互相等待的事务和阻塞链。
- 索引数量过多或频繁添加时,需要通过 pg_stat_user_indexes 识别从未命中的冗余索引。
适合人员
- 后端工程师在为线上 PostgreSQL 慢查询定位责任语句与执行计划时。
- DBA 需要基于系统统计视图评估索引使用并治理冗余索引时。
- 运维工程师在处理数据库连接堆积、锁等待和阻塞告警时。
- 数据平台工程师需要把 PostgreSQL 性能问题转成可验证的优化项时。