mcpField
S
sql-pro

sql-pro

github.com/farmage数据与数据库223304 次安装5 周前更新
代码仓库

关于 sql-pro

SQL Pro 面向编写 SQL 和设计数据库的开发者,提供查询模式与性能优化指导。其流程强调先分析执行计划,再验证优化结果并记录依据。

主要功能

  1. 01检查数据库结构与索引
  2. 02使用 CTE 和窗口函数编写集合式查询
  3. 03通过 EXPLAIN ANALYZE 分析执行计划
  4. 04优化索引与查询
  5. 05查阅数据库方言指南

适用场景

  1. 01改写运行缓慢的 SQL 查询
  2. 02检查索引选择和查询计划
  3. 03设计连接与分析型查询

安装

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

$npx skills add https://github.com/farmage/opencode-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. 适用时提供平台特定说明

文档

评论

支持 Markdown