全部文章
工具笔记

让 AI 读 PostgreSQL 执行计划,先核对行数偏差

找到第一个明显偏差,再决定要不要改索引。

资料核验2026.11.12 · PostgreSQL · 以部署版本文档为准

一条查询耗时高,计划里节点很多。先找估算和实际行数差距最大的早期节点。后面的连接方式可能只是建立在错误估算上的结果。

交给编码助手的任务

把脱敏的 EXPLAIN 输出和查询参数给助手,要求按树从早期节点标记估算行与实际行差异,解释 loops 对阅读的影响。让它提出一个可区分统计、数据倾斜和索引问题的检查。

流程示意:比较估算与实际;结合循环次数;定位第一个偏差

用可重复的读查询做基线

对安全的 SELECT 使用 EXPLAIN (ANALYZE, BUFFERS),保留参数和样本规模。计划中的实际行数在循环节点上通常按每轮平均显示,要结合 loops 阅读。看见偏差时,先确认统计信息、筛选值和数据分布。

ANALYZE 会实际执行语句。对写入或带副作用的查询,应使用隔离环境验证。

如果建议加索引,让助手说清楚想改变哪个节点,再跑一次同条件计划确认效果。

先准备一个对照样例

读计划时可以先抄一行 rows=10、actual rows=120 loops=5。说明估算是该节点的计划值,实际行与循环要结合看。随后沿上游查哪个过滤条件最先出现偏差,并列出能复查的 SQL。

用这些结果验收

  • 报告包含节点、估算值、实际值及循环次数。
  • 复跑保留参数和数据规模。
  • 优化后结果一致,计划变化能解释。

审查时容易漏掉什么

ANALYZE 会实际执行语句。对带副作用的语句在隔离环境跑,常规分析优先使用读查询。AI 从文本推断原因后,仍要用数据库里的数据分布或统计验证。

如果最早偏差出现在过滤节点,先核对谓词和参数类型。后续连接耗时可能只是传入行数超出预期的结果。建议让助手报告可反驳的假设,并用同一组数据重跑,而非只根据截图挑耗时最高的行。

在隔离数据上保存同一条 SQL 的前后两份计划。表名、列名和参数应替换为实际查询。

EXPLAIN (ANALYZE, BUFFERS)
SELECT id, created_at
FROM events
WHERE project_id = 42
ORDER BY created_at DESC
LIMIT 20;

资料来源