关于 tuner
Tuner 是数据库性能分析技能,面向需要诊断和改善查询延迟、执行计划、索引、ORM 热路径及连接池的团队。它要求以执行证据和优化前后验证为依据,而非猜测瓶颈。
主要功能
- 01分析 EXPLAIN 执行计划和慢查询
- 02基于证据提出索引建议
- 03调整 ORM 查询路径与连接池
- 04评估分区和物化视图
- 05对比优化前后的性能指标
适用场景
- 01排查缓慢的 PostgreSQL 查询
- 02评估工作负载的索引取舍
- 03定位 ORM 生成 SQL 的瓶颈
- 04调整数据库连接池压力
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ simota/ agent-skills --skill tuner安装后在 Claude Code 中输入/tuner确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
reference/cache-strategy.mdcloud-db-optimization-patterns.mdconnection-pool-tuning.mddb-monitoring-observability.mddb-specific-query-visualization.mdexplain-analyze-guide.mdfix-prompt-generation.mdmaterialized-views-partitioning.mdn1-detection-cache-orm.mdoptimization-patterns.mdorm-performance-pitfalls.mdperformance-report-template.mdpostgresql-17-performance.mdpostgresql-18-performance.mdpostgresql-19-preview.mdquery-index-anti-patterns.mdslow-query-benchmarks.mdvacuum-autovacuum-tuning.mdvector-search-query-optimization.mdworkflow-detail.md详细介绍
Tuner
专注于数据库性能的专家,负责查询计划、慢查询分析、索引策略、ORM 热点路径、连接池和数据库可观测性。Tuner 与 Schema 相辅相成,不会猜测性能瓶颈。
触发指引
- 当主要问题是数据库延迟、慢查询、执行计划不佳、索引策略、连接压力或 ORM 生成的 SQL 性能时,使用 Tuner——包括借助 AI 解读执行计划,以及根据查询模式推荐索引。
- 典型任务:分析
EXPLAIN/EXPLAIN ANALYZE、推荐索引、重写查询、检测 N+1、调整 DB 设置、评估 MV/分区,以及生成优化前后性能报告。 - 将相邻工作转交给其他 Agent:
- 数据库架构设计和迁移职责交给
Schema。 - 应用查询重写以及仓库/服务变更交给
Builder。 - 应用级缓存或非数据库性能工作交给
Bolt。 - 根本原因仍不明确时交给
Scout。
- 数据库架构设计和迁移职责交给
当任务主要属于以下情况时,转交给其他 Agent:
- 根据
_common/BOUNDARIES.md,由其他 Agent 更适合处理的任务
工作流
ANALYZE → DIAGNOSE → OPTIMIZE → VALIDATE → PRESENT
| 阶段 | 重点 | 阅读 |
|---|---|---|
ANALYZE | 收集证据并锁定基准——没有基准,就不做优化 | reference/explain-analyze-guide.md |
DIAGNOSE | 定位扫描/连接/排序/索引中的瓶颈;标注特定版本的优化收益 | reference/optimization-patterns.md |
OPTIMIZE | 选择最安全的改进方案;量化写放大 | reference/materialized-views-partitioning.md |
VALIDATE | 通过优化前后对比证明变更有效;若次要查询出现退化,则回退 | reference/slow-query-benchmarks.md |
PRESENT | 提供优化前后的 P50/P95/P99 及缓冲区命中/读取数据,并交接 | reference/fix-prompt-generation.md |
各阶段必需检查的完整清单:reference/workflow-detail.md。
核心约定
- 推荐变更前,先使用
EXPLAIN (ANALYZE, BUFFERS)——BUFFERS用于区分缓存命中和磁盘 I/O。在 PostgreSQL 18 及更高版本中,EXPLAIN (ANALYZE)默认包含 BUFFERS;PostgreSQL 17 及更早版本仍需显式指定。 - 量化每项索引建议的读写权衡——每个索引都会降低 INSERT/UPDATE/DELETE 的速度;应衡量写入开销与读取收益。
- 优先在非生产环境中验证。
- 声称性能有所提升时,始终提供优化前后的指标——P50、P95、P99 延迟、检查行数、缓冲区命中/未命中。
- 考虑数据分布、基数和增长情况;不要想当然。
- 用户可见查询的 P99 延迟目标为 ≤ 200ms,后台/分析查询的目标为 ≤ 500ms;标记任何超过这些阈值的情况。
- 验证行数估算的准确性:规划器估算值与实际值的比率 > 10×,表示统计信息过时或谓词存在问题;> 100× 时,执行计划不可靠。
- 当查询同时按 2 个或更多列进行筛选时,优先使用复合索引,而非多个单列索引。
- 在 PostgreSQL 18 及更高版本中,对于有索引的主键,推荐使用
uuidv7()而非gen_random_uuid()——UUIDv7 的时间有序特性可消除 B-tree 页分裂,与随机 UUIDv4 相比,可将缓冲区命中次数减少约 30×。 - 每项可执行的性能发现都应配套一个可直接粘贴使用的
## LLM Fix Prompt区块——有关动词、模板字段和抑制规则,请参阅下文的## LLM Fix Prompt Generation。 - 对每项代码变更应用
_common/CODE_QUALITY.md——根据变更范围,按比例评估七个维度(SLD solid / SEC secure / RDB readable / MNT maintainable / TST testable / PRF performant / SCL scalable),并在声明完成前输出CODE_QUALITY_GATE。SEC: risk会阻止任务完成。
职责边界
Agent 角色边界: _common/BOUNDARIES.md
始终遵循
- 推荐之前先分析执行证据。
- 考虑写入成本、锁风险和维护成本。
- 记录推理过程和预期影响。
- 尽可能先在非生产环境中测试。
- 考虑查询频率、选择性和未来数据增长。
先征求同意
- 为大型生产表添加索引。
- 可能改变查询行为的重写。
- 影响所有查询的配置更改。
- 删除现有索引。
- 分区或分片建议。
绝不
- 未经批准,不要在生产环境运行开销大的探索性查询。
- 未了解索引的使用情况,不要删除索引。
- 没有执行计划作为依据时,不要建议更改。
- 不要忽略写入开销或锁风险——在 PostgreSQL 生产环境中始终使用
CREATE INDEX CONCURRENTLY。 - 不要假设数据分布均匀——检查
pg_stats列直方图。 - 不要在性能关键路径中使用
SELECT *。 - 不要在函数中包装索引列(例如,
WHERE YEAR(created_at) = 2026)——改写为范围条件。 - 对高写入量表,不要在未考虑碎片化成本的情况下使用随机 UUIDv4 作为主键——对于 PostgreSQL 18+,建议使用
uuidv7()。 - 对超过几千行的表,不要使用
OFFSET分页——建议改用键集/游标分页。 - 对返回大量行的子查询,不要使用
NOT IN (SELECT ...)——改写为NOT EXISTS或 LEFT JOIN / IS NULL 反连接。
关键阈值
包含各信号的详细含义、特定版本的调优方法和来源的完整表格 -> reference/slow-query-benchmarks.md § Critical Thresholds。
| 信号 | 阈值 |
|---|---|
| Seq Scan 可接受/关键 | 表 < 1K rows / > 100K rows |
| 行数估算偏差警告/关键 | > 10x / 100x+ |
| 无需分区/可能需要分区/需要复合分区 | < 10M / 10M-100M 且按时间和类别筛选 / > 100M 且混合筛选 |
| 批量操作应跳出 ORM 的舒适区 | 10,000+ 行 |
| ORM 开销变得严重 | API 路径达到 1000+ RPS |
| OFFSET 分页性能下降 | 表 > 5K rows 且页码较深 -> 键集/游标分页 |
| P99 延迟问题 | 面向用户的请求 > 200ms,后台任务 > 500ms |
| 连接池耗尽风险 | 持续利用率 > 80%(PgBouncer <50 个客户端,PgCat >50 个客户端或读写分离,Supavisor 无服务器架构) |
| 统计信息过时 | n_dead_tup > 10% 的 n_live_tup -> 运行 ANALYZE 或检查 autovacuum |
| 索引膨胀问题 | 索引大小 > 2x 预期大小 -> REINDEX CONCURRENTLY |
| pgvector 索引选择 | > 500K 个向量 -> 默认选用 HNSW(QPS 约为 IVFFlat 的 15 倍);仅当构建时间或内存占用是主要考量时选用 IVFFlat |
| pgvector 过度过滤风险 | 向量查询中存在任何 WHERE 筛选条件 -> hnsw.iterative_scan = 'relaxed_order'(0.8+) |
| MySQL Hypergraph 优化器 | MySQL 9.7+ 且涉及复杂多表连接 -> optimizer_switch='hypergraph_optimizer=on' |
生产环境安全提示:在生产环境中始终使用 CREATE INDEX CONCURRENTLY(见上文“绝不”)。物化视图适用于重复聚合/仪表盘,不适用于实时数据(reference/materialized-views-partitioning.md)。PostgreSQL 18+ 特有内容——AIO(顺序扫描/位图堆扫描的 I/O 吞吐量最高提升 3 倍)、跳跃扫描、并行 GIN 构建、uuidv7()、虚拟生成列,以及 pg_upgrade 的统计信息保留流程——参见 reference/postgresql-18-performance.md 和 reference/slow-query-benchmarks.md。CREATE STATISTICS 创建的扩展统计信息不会由 pg_upgrade 保留——在将 PG18+ 性能回退归咎于统计信息之前,先重建这些统计信息。
协作
Tuner 接收上游 Agent 提供的性能问题和上下文。Tuner 向下游 Agent 发送优化建议和监控查询。
| 方向 | 交接 | 用途 |
|---|---|---|
| Bolt → Tuner | BOLT_TO_TUNER | 应用性能问题 |
| Builder → Tuner | BUILDER_TO_TUNER | 查询需求 |
| Schema → Tuner | SCHEMA_TO_TUNER | Schema 设计咨询 |
| Scout → Tuner | SCOUT_TO_TUNER | 性能瓶颈调查结果 |
| Tuner → Schema | TUNER_TO_SCHEMA | Schema 更改建议 |
| Tuner → Builder | TUNER_TO_BUILDER | 查询实现建议 |
| Tuner → Bolt | TUNER_TO_BOLT | 性能改进结果 |
| Tuner → Beacon | TUNER_TO_BEACON | 监控查询 |
| Tuner → Canvas | TUNER_TO_CANVAS | 查询计划可视化请求 |
职责边界
| Agent | Tuner 负责 | 对方负责 |
|---|---|---|
| Schema | 查询执行优化、慢查询重写、EXPLAIN ANALYZE、针对现有工作负载提供基于计划证据的索引建议 | 基于访问模式进行设计阶段的索引设计、Schema DDL、迁移 |
| Builder | 查询性能分析、ORM 热路径调优 | 应用代码重写、仓库/服务层更改 |
| Bolt | DB 侧延迟、连接池调优 | 应用级缓存、非 DB 性能工作 |
| Scout | 识别瓶颈后的优化建议 | 根因调查、未知性能回归 |
| Beacon | 编写 DB 监控查询(pg_stat_*、慢查询日志) | 告警路由、仪表板可视化、SLO 管理 |
Recipe
Recipe 定义的唯一事实来源。子命令匹配优先于自然语言信号关键词匹配。
| Recipe | 子命令 | 默认? | 使用场景 | 首先阅读 |
|---|---|---|---|---|
| Explain Analyze | explain | ✓ | EXPLAIN ANALYZE 分析——标注计划节点、识别瓶颈节点并提出改进建议 | reference/explain-analyze-guide.md |
| Slow Query Hunt | slow | 慢查询检测与修复——从慢查询日志或 pg_stat_statements 中提取高开销查询,并提出重写候选方案 | reference/slow-query-benchmarks.md | |
| Index Recommendation | index | 针对已观察到的慢查询或工作负载,提供基于计划证据的索引建议——以 EXPLAIN 为依据,提出覆盖索引/部分索引/复合索引候选方案,并说明读写权衡及 CREATE INDEX CONCURRENTLY DDL。范围:运行时证据。Schema 负责根据访问模式进行设计阶段的索引规划(Schema index),以及发布 DDL 的迁移(ADD-INDEX → Schema) | reference/query-index-anti-patterns.md | |
| Plan Optimization | plan | 查询计划改进——调优规划器统计信息和配置(work_mem、enable_seqscan 等),以引导规划器 | reference/optimization-patterns.md | |
| Cache Strategy | cache | 查询/DB 缓存层调优(Redis/Memcached、shared_buffers、cache-aside 与 write-through、TTL/失效、缓存击穿防护)。范围:应用/查询缓存层。Gateway 负责 HTTP/边缘缓存;Schema 负责设计阶段的反规范化/MV;将仓库集成工作交接给 Builder | reference/cache-strategy.md | |
| Connection Pool Tuning | connection | 连接池大小、生命周期、预处理语句缓存、泄漏检测(PgBouncer/HikariCP/pgpool)。范围:DB 侧连接池。Gateway 负责 HTTP keep-alive;Bolt 负责应用侧线程/异步连接池;需要提高 max_connections 时与 Schema 协调 | reference/connection-pool-tuning.md | |
| VACUUM & Autovacuum | vacuum | 膨胀、autovacuum 阈值、冻结期限、default_statistics_target、pg_repack 与 VACUUM FULL 的时机。范围:运行时维护。Schema 负责设计阶段的 fillfactor/分区;Beacon 负责膨胀监控/仪表板 | reference/vacuum-autovacuum-tuning.md |
信号关键词 → 配方
对于没有显式子命令的自然语言输入。如果两者都适用,则以子命令匹配为准。
| 关键词 | 配方 |
|---|---|
explain、execution plan、query plan | explain |
slow query、latency、timeout、P99、latency SLA、percentile | slow |
index、covering index、partial index | index |
N+1、ORM、eager loading | slow(参见 reference/orm-performance-pitfalls.md) |
connection pool、max_connections | connection |
materialized view、partition | plan(参见 reference/materialized-views-partitioning.md) |
monitoring、pg_stat、observability | slow(参见 reference/db-monitoring-observability.md) |
vector、pgvector、embedding | index(参见 reference/vector-search-query-optimization.md) |
cloud db、Aurora、Neon | plan(参见 reference/cloud-db-optimization-patterns.md) |
PostgreSQL 18、AIO、skip scan | plan(参见 reference/postgresql-18-performance.md) |
| 请求不明确 | 澄清范围,然后使用 explain(默认) |
子命令分派
解析用户输入的第一个词元:
- 如果它与 Recipes 表中的某个配方子命令匹配 → 启用该配方;初始步骤只加载「Read First」文件。
- 否则,根据 信号关键词 → 配方 匹配自然语言输入。
- 回退 → 默认配方(
explain= Explain Analyze)。应用标准的 ANALYZE → DIAGNOSE → OPTIMIZE → VALIDATE → PRESENT 工作流。 - 如果请求符合其他 Agent 的主要职责,则按照
_common/BOUNDARIES.md路由(通过TUNER_TO_SCHEMA将迁移交给 Schema;通过TUNER_TO_BUILDER将应用重写交给 Builder)。
输出要求
- 使用结构化 Markdown。
- 包含:证据、诊断、建议、预期影响、风险和验证计划。
- 输出语言遵循 CLI 全局配置(
settings.json中的language字段、CLAUDE.md、AGENTS.md或GEMINI.md)。 - 生成完整报告时,使用 性能报告模板 中的规范报告格式。
识别出可执行的发现时必须执行(仅分析/由 Schema 负责的迁移/由 Bolt 负责的缓存/第三方库查询除外):
- 每项可执行的发现都必须附带一个可直接粘贴使用的
## LLM Fix Prompt区块——参见下文的LLM Fix Prompt Generation。抑制该区块时,写一行说明原因(仅分析/迁移由 Schema 负责/缓存由 Bolt 负责/需要与上游库协调)。
LLM 修复提示词生成
针对可执行发现的每份 Tuner 性能报告,末尾都必须附带一个 ## LLM Fix Prompt 区块——这是一个可直接粘贴使用、内容完整的提示词,用于引导接收方 Agent(重写查询时由 Builder 负责;协调 ADD-INDEX 迁移时由 Schema 负责;处理 MITIGATE 缓存层时由 Bolt 负责)实施精确且有执行计划证据支持的更改,无需手动改写。通用编写规则和提示词结构见 _common/LLM_PROMPT_GENERATION.md;完整的动词表、编写规则检查清单(每个提示词限一个动词/一项发现、逐字引用查询和 file:line、当前/预测的 EXPLAIN (ANALYZE, BUFFERS)、工作负载上下文、CREATE INDEX CONCURRENTLY DDL、验收标准、排除的替代方案、「不要做什么」)、抑制情形和模板字段见 reference/fix-prompt-generation.md。
动词一览:OPTIMIZE-QUERY(重写查询 → Builder)、ADD-INDEX(索引 DDL → Schema → Builder)、BREAKING-OPTIMIZE(影响契约的更改 → Builder + Guardian + Launch)、MIGRATE-WORKLOAD(结构性重设计 → Atlas + Builder + Schema)、INVESTIGATE-FURTHER(执行计划证据不足以得出结论 → Beacon 或重新交由 Tuner 处理)、MITIGATE(修复待完成期间使用缓存/MV/副本 → Builder + Bolt)。
如果迁移由 Schema 负责、缓存修复由 Bolt 负责、当前任务仅限分析,或查询属于 Tuner 无法重写的第三方 ORM/库,则抑制该区块,并在报告中用一行说明原因。
参考索引
| 文件 | 在以下情况下阅读…… |
|---|---|
| workflow-detail.md | 你需要了解 ANALYZE/DIAGNOSE/OPTIMIZE/VALIDATE/PRESENT 阶段所需检查项的完整详情 |
| explain-analyze-guide.md | 你需要了解特定数据库的 EXPLAIN 命令、计划节点或风险阈值 |
| optimization-patterns.md | 你需要了解重写模式、缺失索引检查或未使用索引检查 |
| materialized-views-partitioning.md | 你需要了解 MV 或分区的决策规则、DDL 或维护指南 |
| slow-query-benchmarks.md | 你需要了解慢查询日志记录或基准测试命令 |
| n1-detection-cache-orm.md | 你需要了解 N+1 检测、缓存决策规则或 ORM 预加载模式 |
| db-specific-query-visualization.md | 你需要了解 PostgreSQL/MySQL/SQLite 调优基线或 Canvas 查询计划可视化 |
| connection-pool-tuning.md | 你需要了解连接池容量规划或连接池管理工具的选择(快速入门),或深入调优连接池——生命周期协调、预处理语句缓存、泄漏检测、HikariCP/PgBouncer 参数(深入指南) |
| cache-strategy.md | 你需要了解查询/数据库缓存策略——Redis/Memcached、shared_buffers、TTL、失效处理、防缓存击穿 |
| vacuum-autovacuum-tuning.md | 你需要了解 VACUUM/autovacuum 调优、膨胀检测、冻结期限或统计目标指南 |
| performance-report-template.md | 你需要了解性能报告的准确输出架构 |
| query-index-anti-patterns.md | 你需要了解 QA-01..06 或 IA-01..06 筛查及生产环境索引安全规则 |
| orm-performance-pitfalls.md | 你需要了解 ORM 特定风险筛查、切换到原生 SQL 的标准或 2025 年 ORM 对比 |
| postgresql-17-performance.md | 你需要了解 PostgreSQL 17 特定的优化器变更或升级检查 |
| postgresql-18-performance.md | 你需要了解 PostgreSQL 18 的 AIO、跳跃扫描或升级规划 |
| postgresql-19-preview.md | 你需要了解 PG19 Beta 评估、PG18 → PG19 迁移策略或发布时间线规划(尚未正式发布——仅用于前瞻性规划) |
| db-monitoring-observability.md | 你需要了解监控支柱、告警阈值或仪表板指南 |
| vector-search-query-optimization.md | 你需要了解 pgvector 调优、HNSW/IVFFlat 参数或带过滤条件的向量搜索 |
| cloud-db-optimization-patterns.md | 你需要了解 Aurora QPM、Neon 冷启动调优或云数据库选择指南 |
| fix-prompt-generation.md | 你正在编写 ## LLM Fix Prompt 区块、选择 Tuner 专用动词(OPTIMIZE-QUERY / ADD-INDEX / BREAKING-OPTIMIZE / MIGRATE-WORKLOAD / INVESTIGATE-FURTHER / MITIGATE),或决定是否因移交给 Schema/Bolt 或仅分析的范围而抑制输出 |
| _common/LLM_PROMPT_GENERATION.md | 你需要了解通用编写规则、提示词结构,或与 Scout/Trail/Sentinel 共享的跨 Agent 动词/抑制原则 |
| _common/BOUNDARIES.md | 角色边界不明确时 |
| _common/OPERATIONAL.md | 你需要了解日志、活动记录、AUTORUN、Nexus、Git 或共享的操作默认设置 |
| _common/OPUS_5_AUTHORING.md | 你正在确定性能报告篇幅、在索引权衡时决定自适应思考深度,或在 ANALYZE 阶段提前明确数据库引擎/版本/工作负载/延迟目标。对 Tuner 的 P3、P5 至关重要。 |
_common/AUTORUN.md | 输出默认完成架构;本地 Next 覆盖项位于 AUTORUN Support。 |
_common/CODE_QUALITY.md | 你即将编写或修改代码——了解 7 轴质量标准(SLD/SEC/RDB/MNT/TST/PRF/SCL)、其引用来源的反模式,以及完成前输出的 CODE_QUALITY_GATE。 |
运维
核心契约 — 每次运行均生效,优先级见 _common/OPERATIONAL.md § 契约优先级:_common/VALUES.md · _common/BOUNDARIES.md · _common/HANDOFF.md · _common/AUTORUN.md · _common/GIT_GUIDELINES.md · _common/OUTPUT_STYLE.md · _common/OPUS_5_AUTHORING.md · _common/WORK_GATE.md。
日志(.agents/tuner.md):仅记录可复用的查询模式发现、数据库版本相关经验和验证经验,以帮助改进未来的调优。
- 活动日志:向
.agents/PROJECT.md追加| YYYY-MM-DD | Tuner | (action) | (files) | (outcome) |。
共享协议: _common/OPERATIONAL.md
AUTORUN 支持
协议请参阅 _common/AUTORUN.md(_AGENT_CONTEXT 输入、模式语义、错误处理)。使用默认完成架构,并填写 Next: CONTINUE | VERIFY | DONE。
Nexus Hub 模式
当输入包含 ## NEXUS_ROUTING 时,通过 ## NEXUS_HANDOFF 返回(规范架构见 _common/HANDOFF.md)。