mcpField
S
sql-pro

sql-pro

github.com/jeffallan数据与数据库12.1k6.5k 次安装今天更新
代码仓库

关于 sql-pro

sql-pro 是面向 SQL 开发与调优的技能,帮助工程师分析数据库结构、查询模式和执行计划。它使用集合式查询、索引设计与 EXPLAIN ANALYZE 指导优化,并要求说明查询、索引和性能依据。

主要功能

  1. 01分析数据库结构、索引与查询
  2. 02使用 CTE 和窗口函数设计查询
  3. 03依据执行计划进行调优
  4. 04设计覆盖索引并减少全表扫描
  5. 05记录查询与性能分析

适用场景

  1. 01优化运行缓慢的 SQL 查询
  2. 02为常用查询规划索引
  3. 03检查执行计划和扫描情况
  4. 04设计数据库结构与查询模式

安装

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

$npx skills add https://github.com/jeffallan/claude-skills --skill sql-pro

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

包含的文件

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

references/
database-design.md
dialect-differences.md
optimization.md
query-patterns.md
window-functions.md

详细介绍

SQL Pro

核心工作流

  1. 架构分析 - 检查数据库结构、索引、查询模式和性能瓶颈
  2. 设计 - 使用 CTE、窗口函数和适当的联接创建基于集合的操作
  3. 优化 - 分析执行计划、创建覆盖索引、消除全表扫描
  4. 验证 - 运行 EXPLAIN ANALYZE,确认大型表上没有顺序扫描;如果查询未达到 100 毫秒以内的目标,则在继续之前迭代调整索引选择或重写查询
  5. 记录 - 提供查询说明、索引选择依据和性能指标

参考指南

根据上下文加载详细指南:

主题参考资料加载时机
查询模式references/query-patterns.mdJOIN、CTE、子查询、递归查询
窗口函数references/window-functions.mdROW_NUMBER、RANK、LAG/LEAD、分析查询
优化references/optimization.mdEXPLAIN 计划、索引、统计信息、调优
数据库设计references/database-design.md规范化、键、约束、架构
方言差异references/dialect-differences.mdPostgreSQL、MySQL 与 SQL Server 的特定差异

快速参考示例

CTE 模式
-- Isolate expensive subquery logic for reuse and readability
WITH ranked_orders AS (
    SELECT
        customer_id,
        order_id,
        total_amount,
        ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rn
    FROM orders
    WHERE status = 'completed'          -- filter early, before the join
)
SELECT customer_id, order_id, total_amount
FROM ranked_orders
WHERE rn = 1;                           -- latest completed order per customer
窗口函数模式
-- Running total and rank within partition — no self-join required
SELECT
    department_id,
    employee_id,
    salary,
    SUM(salary)  OVER (PARTITION BY department_id ORDER BY hire_date) AS running_payroll,
    RANK()       OVER (PARTITION BY department_id ORDER BY salary DESC) AS salary_rank
FROM employees;
EXPLAIN ANALYZE 解读
-- PostgreSQL: always use ANALYZE to see actual row counts vs. estimates
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT *
FROM orders o
JOIN customers c ON c.id = o.customer_id
WHERE o.created_at > NOW() - INTERVAL '30 days';

输出中需要检查的要点:

  • 大型表上的 Seq Scan → 添加或修复索引
  • 实际行数 ≫ 估算行数 → 运行 ANALYZE <table> 刷新统计信息
  • Buffers: shared hit 与 read → read 计数较高表示缓存或索引缺失
优化前后示例
-- BEFORE: correlated subquery, one execution per row (slow)
SELECT order_id,
       (SELECT SUM(quantity) FROM order_items oi WHERE oi.order_id = o.id) AS item_count
FROM orders o;

-- AFTER: single aggregation join (fast)
SELECT o.order_id, COALESCE(agg.item_count, 0) AS item_count
FROM orders o
LEFT JOIN (
    SELECT order_id, SUM(quantity) AS item_count
    FROM order_items
    GROUP BY order_id
) agg ON agg.order_id = o.id;

-- Supporting covering index (includes all columns touched by the query)
CREATE INDEX idx_order_items_order_qty
    ON order_items (order_id)
    INCLUDE (quantity);

约束

必须执行
  • 提出优化建议前分析执行计划
  • 使用基于集合的操作,而非逐行处理
  • 在查询执行早期进行筛选(尽可能在联接之前)
  • 检查是否存在时使用 EXISTS,而非 COUNT
  • 在比较和聚合中显式处理 NULL
  • 为常用查询创建覆盖索引
  • 使用生产级数据量进行测试
严禁
  • 在生产查询中使用 SELECT *
  • 基于集合的操作可行时使用游标
  • 针对特定方言时忽略平台专属优化
  • 不考虑数据量和基数就实施解决方案

输出模板

实现 SQL 解决方案时,请提供:

  1. 带内联注释的优化查询
  2. 所需索引及其设计依据
  3. 执行计划分析
  4. 性能指标(优化前/后)
  5. 适用时提供平台专属说明

由 @jeffallan 维护,他是 Synergetic Solutions 的首席顾问

文档

评论

支持 Markdown