SQL Optimizer
把一条(或多条)SQL 查询做性能 + 正确性审查与优化,产出可直接落地的
"优化版 SQL" 和"分析报告"两份文档。
When to use
- 用户给了
.sql文件或粘贴了 SQL,要求「优化 / 调优 / 审查 / 提速 / 加索引 / 改写法」。 - 用户想给慢查询重写、去掉冗余 join、加合适索引、或排查结果是否正确(行数翻倍、NULL 丢值、类型误比)。
- 适用 SQL Server / MySQL / Oracle / PostgreSQL(自动识别方言,索引与语法按方言给)。
Workflow
- 读取 SQL:若是目录,读取目录下所有
.sql文件;若是单文件/粘贴,直接读。 - 识别方言:依据语法特征判断库类型(见下),并在分析中标注,所有索引/语法按该方言给出。
- 拆解结构:列出涉及表、join 类型与连接键、WHERE 过滤、投影列、GROUP BY / ORDER BY。
- 跑反模式清单:对照
references/anti_patterns.md,逐项检查:冗余自连接、未使用 join、
隐藏内连接、1:N 扩展表导致的行数膨胀、NULL 拼接吞值、WHERE 中类型强转、索引列上函数导致
非 SARG、同表重复扫描等。 - 基数排查:对任意「一对多」关联,给出
COUNT(*) ... HAVING COUNT(*)>1的核查 SQL,
让用户确认是否存在行数爆炸(先排查再决定是否去重,不要盲目 DISTINCT 掩盖真实数据问题)。 - 语义保持地重写:删死 join、把隐藏内连接改显式 INNER JOIN、加
ISNULL/COALESCE守卫、
用 CTE/子查询提前过滤驱动表、合并重复扫描。 - 给索引方案:依据
references/index_recipes.md,在驱动表过滤列 + 所有连接键上建
过滤索引 + 覆盖索引,按方言给出可运行 DDL。 - 产出两份文件(放在输入同目录):
-<原名>_优化版.sql:可运行优化 SQL + 索引 DDL + 膨胀排查 SQL + 方言适配说明。
-<原名>_优化分析.md:分析报告(问题表 / 改动对照 / 索引 / 风险 / 预期收益),
模板见references/report_template.md。
Dialect detection(方言识别线索)
- SQL Server:
+字符串拼接、CAST(... AS CHAR)、TOP、[方括号]、GETDATE()、
索引INCLUDE、过滤索引WHERE子句、LIKE '69%'可进过滤索引。 - MySQL:反引号、
LIMIT、CONCAT()、索引无 INCLUDE / 无过滤索引。 - Oracle:
||拼接、DUAL、SYSDATE、NVL、函数索引。 - PostgreSQL:
||或CONCAT、ILIKE、部分索引WHERE、索引INCLUDE。
Output conventions(输出约定)
- 优化 SQL 保持语义一致,除非用户明确接受行为变更(如用 DISTINCT 去重)。
- 遇到行数膨胀风险,先给排查 SQL 并提示风险,不要直接加 DISTINCT 掩盖问题。
- 方言不明确时,同时给 SQL Server 与 MySQL 两种写法。
- 字符串拼接统一用防御性写法:
ISNULL(a,'')+ISNULL(b,'')(MSSQL) /
CONCAT(COALESCE(a,''),b)(MySQL/Oracle/PG)。
References
references/anti_patterns.md—— 反模式完整目录(含 before/after 示例)。references/index_recipes.md—— 各数据库索引 DDL 模板。references/report_template.md—— 分析报告 markdown 骨架。
Examples
- 「优化这个查询」+ 一段 SQL Server 服装 ERP 查询
→ 读、判定 MSSQL、发现冗余自连接 + 未使用 join + 隐藏内连接 + 规格表笛卡尔风险,
重写,出过滤/覆盖索引 DDL,写_优化版.sql与_优化分析.md。 - 「SELECT 四个标量子查询拼一起,能不能优化成一条」
→ 判定为条件聚合场景,改写为CASE WHEN ... SUM()一次扫表。 - 「MSSQL、MySQL 如何建只读用户」
→ 不属于本 skill(属权限管理),可转数据库运维类 skill 或普通回答。