Analyzes SQL queries for missing indexes, N+1 patterns, suboptimal joins, and full table scans. Interprets EXPLAIN, detects anti-patterns, rewrites queries. Triggers on: "optimize this query", "slow query", "add indexes", "explain plan", "N+1 query", "why is this query slow".
Systematic SQL performance analysis: parse query structure, interpret EXPLAIN plans, detect anti-patterns (N+1, full scans, cartesian joins), recommend indexes, and rewrite queries — with explanations of WHY each change improves performance, not just WHAT changed.
| File | Contents | Load When |
|---|---|---|
references/anti-patterns.md | Common SQL anti-patterns with detection rules and fixes | Always |
references/index-strategies.md | Index type selection, composite index ordering, covering indexes | Index recommendations needed |
references/explain-guide.md | Reading EXPLAIN output for PostgreSQL, MySQL, SQLite | EXPLAIN plan provided |
references/join-optimization.md | Join type selection, join order optimization, subquery-to-join conversion | Query contains joins or subqueries |
Parse the SQL to understand its structure:
SELECT * — fetching unnecessary columnsOR in WHERE — often prevents index useIf an EXPLAIN plan is provided:
ANALYZE).Check for known performance anti-patterns (see references/anti-patterns.md):
| Pattern | Detection | Impact |
|---|---|---|
| SELECT * | Star in select list | Transfers unnecessary data |
| N+1 queries | Loop with query inside | N additional roundtrips |
| Function on indexed column | WHERE UPPER(name) = 'X' | Index bypass |
| Implicit type cast | String compared to integer | Index bypass |
| Missing join condition | Cartesian product | Exponential rows |
| LIKE '%prefix' | Leading wildcard | Full scan |
| OR with different columns | WHERE a=1 OR b=2 | Index bypass |
| SELECT DISTINCT as band-aid | Hides duplicate-producing join | Fix the join instead |
IN (SELECT...)
with EXISTS, use CTEs for readability without performance cost (PostgreSQL 12+
may inline CTEs).Present the original query, detected issues, recommended indexes, rewritten query, and explanation of each change.
## SQL Optimization Analysis
### Original Query
```sql
{original SQL}
```
### Issues Detected
| # | Issue | Severity | Location | Impact |
| --- | ------- | ----------------- | ------------------- | ---------------- |
| 1 | {issue} | {High/Medium/Low} | {WHERE/JOIN/SELECT} | {what it causes} |
### EXPLAIN Interpretation
{If EXPLAIN provided}
- **Bottleneck:** {node type} on `{table}` (cost: {N})
- **Rows scanned:** {N} (estimated {M})
- **Index used:** {name or "None"}
- **Key insight:** {what this reveals}
### Recommended Indexes
```sql
-- {Reason for this index}
CREATE INDEX {name} ON {table}({columns});
```
### Optimized Query
```sql
{rewritten query}
```
### Change Explanation
1. **{Change}** — {Why this improves performance. Include estimated impact.}
### Expected Improvement
- Scan type: {before} → {after}
- Estimated rows scanned: {before} → {after}
- Index usage: {before} → {after}
| Mode | Input | Depth | When to Use |
|---|---|---|---|
quick | Single query | Anti-pattern scan + index suggestion | Fast feedback during development |
standard | Query + schema | Full analysis with rewrites | Default for optimization requests |
deep | Query + EXPLAIN + schema + row counts | Full analysis with statistics validation | Production performance investigation |
users.email" is incomplete.
"Add an index on users.email because the WHERE clause filters by email, currently
causing a sequential scan of 1M rows" is actionable.| Problem | Resolution |
|---|---|
| No EXPLAIN output provided | Analyze query structure and anti-patterns. Note that recommendations are best-effort without EXPLAIN. |
| Unknown database engine | Ask which engine. Default anti-pattern analysis applies to all engines. |
| Query uses ORM-generated SQL | Optimize the SQL, then suggest ORM-level changes (e.g., select_related in Django, eager loading). |
| Schema not provided | Infer table structure from the query. Note assumptions. |
| Query is already optimal | State that no significant improvements are possible. Suggest non-query optimizations (caching, denormalization). |
| Complex multi-CTE query | Analyze each CTE independently, then analyze the composition. |
Push back if: