mcpField
D
data-sql-optimization

data-sql-optimization

github.com/vasilyu1983数据与数据库231 次安装
代码仓库

关于 data-sql-optimization

面向工程师的数据库性能技能,涵盖 PostgreSQL、MySQL、SQL Server、Oracle 和 SQLite 的 SQL 诊断与调优。它强调基于证据分析、安全变更检查和版本适配建议。

主要功能

  1. 01跨数据库引擎的 SQL 性能指导
  2. 02基于 PostgreSQL 统计信息的慢查询排查
  3. 03收集预估计划与实际计划
  4. 04索引、查询、锁与连接池参考
  5. 05生产变更验证与回滚检查

适用场景

  1. 01排查数据库慢查询
  2. 02审查执行计划和索引选择
  3. 03诊断锁等待或连接饱和
  4. 04规划并验证生产调优变更

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/vasilyu1983/ai-agents-public --skill data-sql-optimization

安装后在 Claude Code 中输入/data-sql-optimization确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

learnings.consolidated.md
learnings.md
agents/
openai.yaml
assets/cross-platform/
template-backup-restore.md
template-diagnostics.md
template-explain-analysis.md
template-index.md
template-lock-analysis.md
template-migration.md
template-performance-tuning-worksheet.md
template-query-tuning.md
template-schema-design.md
template-security-audit.md
template-slow-query.md
assets/mssql/
template-mssql-explain.md
template-mssql-index.md
assets/mysql/
template-mysql-explain.md
template-mysql-index.md
template-replication-ha.md
assets/oracle/
template-oracle-explain.md
assets/postgres/
template-pg-explain.md
template-pg-index.md
template-pg-rls.md
template-replication-ha.md
assets/sqlite/
template-sqlite-optimization.md
data/
sources.json
versions.json
references/
connection-pooling-patterns.md
explain-analysis.md
index-patterns.md

详细介绍

SQL 优化

不在范围内: OLAP 引擎和湖仓调优。对于 ClickHouse、DuckDB、Doris、StarRocks、Iceberg、Delta Lake 或 Hudi,请使用 data-lake-platform。

快速参考

脚本
脚本功能用法
scripts/pg_slow_query_triage.sql基于 pg_stat_statements 生成包含六个部分的排查报告:总耗时、平均耗时、I/O、方差、缓存命中率,以及溢写/规划/WAL复制并粘贴到 psql 或任意 SQL 客户端中;需要 pg_stat_statements 扩展
scripts/explain_collector.py通过 psql 收集估算的 JSON 执行计划;使用 --analyze 可选择执行查询DATABASE_URL=postgresql://... python explain_collector.py --queries slow.txt
scripts/test_explain_collector.py离线输入、执行模式和 JSON 封装回归测试python scripts/test_explain_collector.py
# Triage: paste directly into psql
psql "$DATABASE_URL" -f skills/universal/data-sql-optimization/scripts/pg_slow_query_triage.sql

# Collect estimated plans for reviewed queries (default):
python scripts/explain_collector.py --queries queries.txt --no-analyze --output plans.jsonl

# Collect actual plans (executes queries — review side effects first):
DATABASE_URL=postgresql://user:pass@test-db:5432/db \
  python scripts/explain_collector.py --queries queries.txt --analyze --output plans.jsonl
需求从这里开始适用场景
慢查询排查template-slow-query.md修改任何内容之前,需要先安全地收集信息
执行计划审查references/explain-analysis.md已有 EXPLAIN、EXPLAIN ANALYZE、Query Store 或 Performance Schema 证据
索引设计或删除索引references/index-patterns.md正在考虑添加、调整、设为不可见或删除索引
查询重写references/query-tuning-patterns.md查询结构或估算问题可能是瓶颈
连接饱和references/connection-pooling-patterns.md涉及应用连接池、PgBouncer、RDS Proxy、Supavisor 或 Cloud SQL 连接池
监控和告警references/monitoring-alerting-patterns.md需要数据库性能仪表板、基线或告警
锁 / 死锁template-lock-analysis.md问题是阻塞、死锁或长事务,而非查询本身的开销
分区references/partition-strategies.md保留策略、分区裁剪或表增长是变更原因
备份和恢复设计references/recovery-strategy-design.md需要根据故障场景制定恢复能力,而不只是备份任务
安全或 RLS 审查template-security-audit.md正在审查最小权限、SQL 注入防护或租户隔离

覆盖范围模型

引擎状态说明
PostgreSQL主要覆盖最深入。此处使用的版本门控功能(跳过扫描、AIO、uuidv7()、在 pg_upgrade 期间保留统计信息)于 PostgreSQL 18 中推出
MySQL主要生产环境建议使用 LTS 版本线,而非 Innovation 版本。依赖 HyperGraph 优化器生成的计划之前,请先确认它在用户所用版本中是否默认启用
SQL Server主要对计划回归使用 Query Store;IQP 功能有不同的发布和兼容性前提条件。推荐具体功能之前,请查看 Microsoft 功能矩阵
Oracle次要针对优化器特有的边缘情况,使用模板和官方文档
SQLite次要重点关注索引、规划器行为、WAL 和 PRAGMA optimize

版本查询:首先通过 SELECT version()(或 @@version)获取用户的准确版本;当前次要版本见 data/versions.json(postgresql、mysql),该文件由脚本更新。有关支持哪些主版本或 LTS 版本线,以及各版本何时结束生命周期,请查阅供应商的版本管理或支持政策页面;应在当前使用的版本线达到 EOL 之前规划升级。推荐使用较新主版本的功能之前,请在发行说明中确认该主版本已正式发布(GA);不要推荐仅适用于测试版的功能用于生产环境。

首次响应检查清单

推荐更改之前,请收集:

  1. 数据库引擎和准确版本
  2. 查询文本或工作负载形态
  3. 相关架构、索引和估算行数
  4. 实际证据:执行计划输出、等待统计信息、查询统计信息或错误文本
  5. 最近的更改:架构、配置、部署、流量激增或数据倾斜
  6. 并发情况:应用连接池、服务端连接池或副本拓扑
  7. 成功指标:p95 延迟、CPU、读取量、锁定时间、错误率或连接数

如果缺少其中任何一项,请先索取相关信息,或使用信息收集模板,再建议生产环境更改。

由 EXPLAIN 驱动的诊断检查清单

从估算计划开始。只有在检查语句、函数和触发器后,才捕获实际执行计划:ANALYZE 会执行语句,而回滚无法撤销序列变更或外部影响。收集器要求每条语句占一行,并会拒绝内部包含分号的语句,包括字符串字面量或注释中的分号。

-- PostgreSQL: estimated plan first; opt into ANALYZE for reviewed execution
EXPLAIN (VERBOSE, FORMAT TEXT) <query>;

-- MySQL: get JSON plan for detailed cost breakdown
EXPLAIN FORMAT=JSON <query>;

-- SQL Server: turn on I/O and CPU evidence
SET STATISTICS IO, TIME ON;
<query>;
步骤检查内容危险信号
1运算符耗时和循环次数父级耗时包含子级工作;不要将它们相加,也不要把成本单位当作毫秒
2估算行数与实际行数任一方向的比率 >10x
3循环次数 * 每次循环的行数 = 处理的总行数即使单次循环看起来成本低,总量仍可能很高
4共享缓冲区命中数与读取数(PostgreSQL)热门查询的 reads 远大于 hits
5排序或哈希溢出Sort Method: external merge、Hash Batches > 1
6热点路径上的键/书签查找每个父行都要查找多次;添加 INCLUDE 列
7嵌套循环的外层行数 × 内层工作量选择连接策略前,检查估算结果和内层重复扫描
8等待时间远大于执行时间排查锁或连接池饱和,而非执行计划

瓶颈决策表:

执行计划显示可能原因首选措施
顺序扫描,读取行数/返回行数很高缺少/不可用的索引,或这是合理的扫描选择检查选择性和可搜索性;比较索引试验结果
索引扫描,但循环次数很高N+1 或连接顺序不佳批量处理或修正估算
实际行数远大于估算行数统计信息过时/不足ANALYZE;CREATE STATISTICS(PG);直方图(MySQL)
执行计划随参数变化参数敏感性Query Store / OPPO(SQL Server);拆分查询形态
排序溢出投影过宽;缺少顺序匹配的索引缩小投影范围;添加覆盖索引
执行计划成本低,但实际耗时长等待:锁、I/O、连接池检查 pg_stat_activity、等待事件、连接池统计信息

工作流

  1. 在建议变更前,确认引擎、工作负载、症状和可用证据。
  2. 如果 SQL 调优并非主要问题,则将搜索、数据湖仓、后端架构或高度依赖可观测性的工作转交给相邻技能。
  3. 提出索引、重写或配置变更前,先收集执行计划、统计信息和工作负载上下文。
  4. 每次只调整一个因素,并在每一步之后验证正确性和性能影响。
  5. 最终给出建议前,使用导航参考重新检查与版本相关的行为。
生产变更准入门槛

根据要实施的变更选择验证方法和回滚方案:

变更试验回滚触发条件回滚
查询重写重放有代表性的参数和并发负载;比较结果集返回错误行,或 p95/读取数/锁的表现变差还原查询或关闭功能标志
新索引在可用时通过引擎的在线/并发路径创建;确认执行计划已采用写入延迟、锁定时间或存储空间超出预算检查依赖项后,通过安全的在线路径删除
统计信息变更捕获不同偏斜值下变更前后的执行计划其他参数类别出现性能回退恢复目标值/统计信息设置并执行 analyze
连接池/配置变更对一个服务或连接池进行金丝雀发布;监控等待和饱和情况排队、超时或连接抖动增多恢复先前值,并仅重建受影响的连接池
分区/架构变更使用符合生产特征的数据进行演练,并验证双读/双写行数不匹配、写入方受阻或复制延迟停止切换,将流量恢复到旧路径

不要仅凭一次预热缓存后的执行就宣称调优成功。在相同的工作负载时间窗口内,记录正确性、p50/p95/p99、逻辑/物理读取数、CPU、锁和写入影响;注明任何无法测量的指标。

路由指南

如果问题是查询缓慢

如果问题可能与基数或估算器偏差有关

如果问题与索引设计有关

如果问题是阻塞或锁等待

如果问题是连接压力

如果请求涉及 PostgreSQL 租户隔离或权限审查

导航与模板

仅在记录相应决策时,加载跨数据库引擎工作表:

决策模板
多症状事件诊断诊断
重写与结果等价性审查查询调优
新建架构或完整性审查架构设计
记录基线、实验和验证调优工作表
记录跨数据库引擎的执行计划审查EXPLAIN 分析
记录索引试验及其写入影响索引设计
演练架构发布与回滚迁移
演练恢复并验证已恢复的数据备份/还原
规划复制拓扑、延迟和故障转移MySQL 复制/HA、PostgreSQL 复制/HA
调优嵌入式 SQLite 工作负载SQLite 优化

参考指南 — 按需加载:

  • references/explain-analysis.md — 阅读 EXPLAIN/EXPLAIN ANALYZE 输出时加载:行数估算、连接顺序、内存溢出,以及各数据库引擎的采集命令。
  • references/index-patterns.md — 决定是否添加、调整或弃用索引时加载;涵盖复合、部分、覆盖、BRIN、不可见索引和 PG18 跳跃扫描。
  • references/query-tuning-patterns.md — 可能需要修改 SQL 本身来修复问题时加载:可搜索性、OR 重写、键集分页、N+1 合并和估算修正。
  • references/sql-best-practices.md — 获取基于工作负载的调优默认值和安全变更工作流时加载;适合在进行生产环境变更前参考。
  • references/sql-antipatterns.md — 在架构或查询代码审查期间加载,以发现并处理常见反模式(SELECT *、N+1、EAV、不可搜索谓词)。
  • references/query-optimization-research-runtime.md — 建议依赖特定版本的数据库引擎行为时加载(PG18 AIO、MySQL HyperGraph、SQL Server 2025 IQP、LITHE 重写研究)。
  • references/partition-strategies.md — 表增长、数据保留或清理压力促使考虑分区时加载;包含迁移模式和 pg_partman 指南。
  • references/connection-pooling-patterns.md — 问题表现为连接饱和、连接池配置错误,或需要选择云托管连接池(PgBouncer、RDS Proxy、Supavisor、Cloud SQL)时加载。
  • references/monitoring-alerting-patterns.md — 为 PostgreSQL、MySQL 或 SQL Server 设置查询统计、等待事件监控或警报阈值时加载。
  • references/operational-patterns.md — 生产环境调优工作流、安全迁移检查清单、数据库引擎特定的运维注意事项、work_mem 容量规划、事务空闲时的锁级联,以及在线架构变更工具(gh-ost 与 pt-osc)相关内容。
  • references/recovery-strategy-design.md — 设计或审查备份与恢复方案时加载:故障场景分类、各故障类别的检测方式、存储分层,以及作为交付成果的恢复测试。

主要来源位于 data/sources.json。

已知陷阱

  • 顺序扫描、哈希连接、物化、子查询和 CTE 都可能是正确的选择。重写前应先要求提供执行计划证据。
  • 每增加一个索引,都会增加写入和维护工作。检查是否存在重叠索引,并在衡量读取收益的同时测量写入影响。
  • 开发数据会掩盖生产环境中的数据倾斜和租户热点;应在并发条件下比较具有代表性的参数。
  • 查询、架构和统计信息检查完毕后,可将规划器提示和会话参数作为诊断实验;不要在不同引擎之间照搬提示。

相关技能

经验总结循环

如果先前的决策或陷阱与当前情况相关,请查阅 learnings.consolidated.md(如果存在);只有在需要了解历史记录或将其作为可用的备用来源时,才使用 learnings.md。否则跳过两者。

应用经验后,如果遇到了值得记住的模式、值得避免的错误,或令你意外的领域事实,请通过 agents-skills-feedback-loop/scripts/append_learning.py 向 learnings.md 追加一条带日期的条目。不要修改 SKILL.md 本身。

评论

支持 Markdown