SQL Pro 是一个面向 SQL 查询优化、数据库结构设计与性能问题排查的技能。根据其说明,当用户询问查询为什么慢,或需要编写复杂查询时使用。
核心工作流
该技能采用五步工作流:
- 模式分析:审查数据库结构、索引、查询模式和性能瓶颈。
- 设计:使用 CTE、窗口函数和恰当的连接构建基于集合的操作。
- 优化:分析执行计划,实现覆盖索引,消除全表扫描。
- 验证:运行 EXPLAIN ANALYZE 并确认大表上没有顺序扫描;如果查询未达到亚 100 毫秒目标,则在继续之前迭代索引选择或重写查询。
- 文档:提供查询说明、索引理由和性能指标。
参考指南
该技能按使用场景提供详细参考文档,涉及以下主题:
- 查询模式:涉及 JOIN、CTE、子查询、递归查询时加载。
- 窗口函数:涉及 ROW_NUMBER、RANK、LAG/LEAD、分析类查询时加载。
- 优化:涉及 EXPLAIN 计划、索引、统计信息、调优时加载。
- 数据库设计:涉及规范化、键、约束、模式时加载。
- 方言差异:涉及 PostgreSQL 与 MySQL 与 SQL Server 的具体差异时加载。
示例模式
资料中提供了一些快速参考示例,包括:
- CTE 模式:使用 CTE 隔离开销较大的子查询逻辑以便复用和提高可读性,示例中用 ROW_NUMBER() 窗口函数按客户分组并按订单日期降序取每条客户最近一笔已完成订单,并在连接前先做过滤。
- 窗口函数模式:使用 SUM() 和 RANK() 分区计算部门内累计薪资和薪资排名,无需自连接。
- EXPLAIN ANALYZE 解读:PostgreSQL 中建议始终使用 ANALYZE 查看实际行数与估算行数的对比;检查要点包括大表上的顺序扫描需添加或修正索引、实际行数远大于估算行数时需运行 ANALYZE 刷新统计信息、Buffers 的 shared hit 与 read 对比中读取量高说明可能缺少缓存或索引。
- 优化前后对比:示例展示将逐行执行的关联子查询改写为单次聚合连接,并配合覆盖索引提高性能。
约束要求
必须做到:在给出优化建议前分析执行计划;优先使用基于集合的操作而非逐行处理;在查询执行早期(尽量在连接之前)应用过滤;存在性检查使用 EXISTS 而非 COUNT;在比较和聚合中显式处理 NULL;为高频查询创建覆盖索引;使用生产规模的数据量进行测试。
不得做的:在生产查询中使用 SELECT *;在基于集合的操作可行时使用游标;针对特定方言时忽略平台特定的优化;不考虑数据量和基数就实施方案。
输出模板
在实现 SQL 方案时,该技能要求提供:带内联注释的优化查询、所需索引及其理由、执行计划分析、性能指标(优化前后对比)、如适用则附平台特定说明,以及文档。