mcpField
S
slowplan

slowplan

本地服务
github.com/GillMacedo数据库02 周前更新

关于 slowplan

slowplan 是面向 PostgreSQL 用户的 MCP 服务和命令行工具,用于解读查询计划。它无需连接数据库即可分析 EXPLAIN 文本,排列可能的瓶颈,并比较修改前后的计划。

主要功能

  1. 01审查 PostgreSQL EXPLAIN 计划
  2. 02排列可能的性能瓶颈
  3. 03标记估算、扫描、连接和磁盘溢写
  4. 04比较修改前后的计划
  5. 05按严重程度输出 JSON 或使 CI 失败

适用场景

  1. 01根据计划输出排查慢查询
  2. 02检查添加索引后查询计划是否变化
  3. 03确定 EXPLAIN ANALYZE 报告中的问题优先级

MCP 相关

MCP 服务提供工具,可从文本或文件审查单个 PostgreSQL 计划,也可比较两个计划。它分析提供的计划数据,不会连接数据库。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"gillmacedo-slowplan": {
"command": "npx",
"args": [
"-y",
"slowplan"
]
}
}
}
启动命令npx -y slowplan

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmslowplan0.1.0

工具

2

收录的工具列表 · 更新于 2 周前

参数类型必填说明
afterstring否更改后的 EXPLAIN 输出
beforestring否更改前的 EXPLAIN 输出
after_pathstring否包含更改后执行计划的文件路径
before_pathstring否包含更改前执行计划的文件路径

详细介绍

slowplan:这个 PostgreSQL 查询为什么这么慢?

npm CI MIT license

一个 MCP 服务和 CLI,可读取 PostgreSQL EXPLAIN 输出,告诉你耗时所在以及优先尝试什么。它只根据计划文本工作,因此不会连接数据库。

冗长的 EXPLAIN ANALYZE 很难读懂,也很容易判断失误:Postgres 在并行计划中报告的是每个工作进程的平均值,而看起来最慢的节点往往并非耗时所在。slowplan 会计算每个步骤的实际耗时,并按问题严重程度排序,例如丢弃行的顺序扫描、错误的行数估算、溢出到磁盘的排序和哈希,以及多次运行的嵌套循环。

可以向 Agent 提什么问题

  • “这个 Postgres 查询很慢。这是 EXPLAIN ANALYZE 输出。”
  • “为什么规划器在这里执行顺序扫描?”
  • “我加了一个索引。它有帮助吗?”
  • “这个计划里最该先修复什么?”

安装

作为 Claude Code 插件:

claude plugin marketplace add GillMacedo/slowplan
claude plugin install slowplan@slowplan-marketplace

作为 MCP 服务,供任何客户端使用:

{"mcpServers": {"slowplan": {"command": "npx", "args": ["-y", "[email protected]", "serve"]}}}

作为 CLI,要求 Node 18 或更高版本:

npx slowplan review plan.txt

或者使用 Go 1.27 或更高版本:go install github.com/GillMacedo/slowplan@latest。

用法

使用 EXPLAIN (ANALYZE, BUFFERS) <your query> 获取计划,格式可以是文本或 JSON。**ANALYZE 会实际运行查询,**因此对于任何写入操作,都要放在会回滚的事务中执行。

以下是来自 PostgreSQL 17 的真实计划,表名为虚构:

$ make demo
Execution 48.9 ms, planning 0.3 ms

Where the time goes:
   80.8%      39.5 ms  Bitmap Heap Scan on orders
    3.9%       1.9 ms  Bitmap Index Scan on orders_status_idx

HIGH   PG102 Bitmap Heap Scan on orders
  The index doesn't cover the whole filter. Read and threw away 84857 rows to keep 857, using filter (bucket = 7).
  Try: Candidate to test: CREATE INDEX CONCURRENTLY ON orders (bucket), or add these columns to the index in use.

These are leads from one run. Test a fix on realistic data before relying on it.

要检查改动,请比较改动前后的计划:

slowplan compare before.txt after.txt

在 examples/ 中的一个真实示例里,添加 slowplan 建议的索引后,查询耗时从约 25 ms 降到了 0.1 ms。

添加 --json 以输出 JSON,或添加 --fail-on high 以在 CI 中以代码 1 退出。使用 - 从标准输入读取。

可发现的问题

规则可发现的问题
PG101顺序扫描丢弃了读取的大部分行
PG102索引未覆盖整个筛选条件
PG103连接产生行后又将其丢弃
PG104位图重检丢弃了许多行
PG105行数估算偏差达到 10 倍或以上
PG106嵌套循环的内侧运行了 1,000 次或以上
PG107排序溢出到磁盘
PG108哈希表被拆分为多个磁盘批次
PG109并行工作进程少于计划数量
PG110仅索引扫描仍频繁访问表
PG111位图变成有损位图
PG112从共享缓冲区外读取约 80 MB 或更多数据
PG113规划耗时超过查询运行时间
PG114JIT 耗时达到 100 ms 或以上

严重程度取决于查询耗时占比:高表示 20% 或以上;低表示低于 5% 或低于 1 ms。这些阈值是经验判断。

MCP 工具

工具功能
postgres_plan_review检查一个计划,输入可以是文本或文件
postgres_plan_compare比较改动前后的计划

限制

  • 建议的索引只是候选项。 执行计划展示的是一条查询和一组值,不会显示你的其他索引,也不会显示索引对写入的成本。请使用真实的数据进行测试。
  • 一次运行不算基准测试。 缓存未命中或服务器繁忙都会影响耗时。
  • 它无法查看锁、网络耗时或执行计划之外的任何内容。只有估算值的执行计划没有任何实测数据,slowplan 会说明这一点。
  • **并行执行计划中的耗时是估算值,**因为 Postgres 报告的是各工作进程的平均值。
  • 仅支持 PostgreSQL。其他工具的文本执行计划或经过大量编辑的执行计划可能无法解析。JSON 格式最可靠。
  • 执行计划可能包含查询中的值。slowplan 会在你的设备上运行,但 MCP 客户端会将工具结果发送给其模型。

常见问题

如何阅读 EXPLAIN ANALYZE 的输出? 将其交给 slowplan,它会展示耗时都花在了哪里。

为什么 Postgres 会执行顺序扫描? 通常是因为没有合适的索引,或者筛选条件会保留太多行,导致索引无济于事。PG101 会显示有多少行被过滤掉。

如何判断排序或哈希操作是否在使用磁盘? PG107 和 PG108 会标记这些情况。

这与 pev2 或 postgres-mcp 有何不同? pev2 是面向用户的可视化工具。postgres-mcp 会连接到实时数据库。slowplan 会根据执行计划文本向 Agent 提供按优先级排序的发现结果,且无需访问数据库。

测试情况

PG101、PG102、PG104 至 PG112 已使用来自 PostgreSQL 17 数据库的真实执行计划进行测试,这些计划使用了虚构的表,以 JSON 和文本格式存放在 examples/ 中。PG103、PG113 和 PG114 仅使用编写的示例进行测试。MCP 工具调用已通过 MCP Inspector 测试。它尚未用于真实的生产查询。

贡献

欢迎个人以及与 AI Agent 合作的贡献者参与。请参阅 CONTRIBUTING.md。适合新手的 issue 列在此处。

Pull request 的处理方式
  1. 创建 PR。 Fork 仓库,在分支上开展工作,并确保只包含一项更改。标题应说明用户会看到什么变化,因为它会成为变更日志条目:feat: 会列在 Added 下,fix: 会列在 Fixed 下。
  2. 自动检查。 代码更改必须附带测试,且 make test 必须通过。超过 30 行的更改必须关联一个未关闭的 issue(Closes #<number>),且 PR 的更改行数不得超过 800 行。如果缺少内容,系统会通过评论告知你需要修正的地方。
  3. 审查。 Claude 会自动审查每个 PR。代码 PR 还会接受安全审查,并在沙盒中进行测试。之后,审查流程会合并 PR 或要求修改。更改 CI、Agent 设置、npm 或 Python 依赖项、供应代码或构建文件的 PR 无法通过此流程合并,系统会通过评论说明原因。安全审查未通过的更改也同样无法合并。
  4. 发布。 合并后会影响用户安装内容的更改,会在大约两小时内发布为新版本,并附带 GitHub Release;如果项目有 npm 包,也会一并发布。文档和 CI 更改会留待下次发布。

AI 使用说明

本项目大部分由 Claude Code 生成,并由维护者审查。

关于我

我是 Giulliano Macedo,在 GoTech Solutions 开发开发者工具。欢迎关注或联系我:

如果 slowplan 帮你找到了慢查询,点个星标能帮助其他人发现它。


由 Giulliano Macedo、GoTech Solutions 打造 · LinkedIn · X

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。