关于 sql-pro
sql-pro 是面向 SQL 开发与调优的技能,帮助工程师分析数据库结构、查询模式和执行计划。它使用集合式查询、索引设计与 EXPLAIN ANALYZE 指导优化,并要求说明查询、索引和性能依据。
主要功能
- 01分析数据库结构、索引与查询
- 02使用 CTE 和窗口函数设计查询
- 03依据执行计划进行调优
- 04设计覆盖索引并减少全表扫描
- 05记录查询与性能分析
适用场景
- 01优化运行缓慢的 SQL 查询
- 02为常用查询规划索引
- 03检查执行计划和扫描情况
- 04设计数据库结构与查询模式
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ jeffallan/ claude-skills --skill sql-pro安装后在 Claude Code 中输入/sql-pro确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/database-design.mddialect-differences.mdoptimization.mdquery-patterns.mdwindow-functions.md详细介绍
SQL Pro
核心工作流
- 架构分析 - 检查数据库结构、索引、查询模式和性能瓶颈
- 设计 - 使用 CTE、窗口函数和适当的联接创建基于集合的操作
- 优化 - 分析执行计划、创建覆盖索引、消除全表扫描
- 验证 - 运行
EXPLAIN ANALYZE,确认大型表上没有顺序扫描;如果查询未达到 100 毫秒以内的目标,则在继续之前迭代调整索引选择或重写查询 - 记录 - 提供查询说明、索引选择依据和性能指标
参考指南
根据上下文加载详细指南:
| 主题 | 参考资料 | 加载时机 |
|---|---|---|
| 查询模式 | references/query-patterns.md | JOIN、CTE、子查询、递归查询 |
| 窗口函数 | references/window-functions.md | ROW_NUMBER、RANK、LAG/LEAD、分析查询 |
| 优化 | references/optimization.md | EXPLAIN 计划、索引、统计信息、调优 |
| 数据库设计 | references/database-design.md | 规范化、键、约束、架构 |
| 方言差异 | references/dialect-differences.md | PostgreSQL、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 解决方案时,请提供:
- 带内联注释的优化查询
- 所需索引及其设计依据
- 执行计划分析
- 性能指标(优化前/后)
- 适用时提供平台专属说明
由 @jeffallan 维护,他是 Synergetic Solutions 的首席顾问
评论
支持 Markdown