Analyzes SQLScript code for performance issues and suggests optimizations with auto-fix capability
Analyzes SQLScript code for performance issues and suggests optimizations with auto-fix capability
/plugin marketplace add secondsky/sap-skills/plugin install sap-sqlscript@sap-skillsAnalyze SQLScript procedures and functions for performance anti-patterns and suggest optimizations. Offers auto-fix for common performance issues.
/sqlscript-optimize [file_path]
/sqlscript-optimize [file_path] --fix
/sqlscript-optimize [file_path] --explain
| Issue | Auto-Fix Available | Notes |
|---|---|---|
| Cursor loop to set-based | Partial | Simple patterns only |
| UNION to UNION ALL | Yes | When safe to change |
| SELECT * to column list | No | Requires column selection |
| Subquery to JOIN | Partial | Standard patterns |
| Add LIMIT clause | Yes | Adds configurable limit |
| Filter pushdown | Yes | Moves WHERE earlier |
## SQLScript Performance Analysis
**File**: [filename]
**Procedure/Function**: [name]
**Estimated Impact**: [High/Medium/Low]
### Critical Performance Issues
#### Issue 1: [Name] (Impact: High)
**Location**: Lines X-Y
**Current Pattern**:
```sql
[current code]
Optimized Pattern:
[optimized code]
Expected Improvement: [description] Auto-fix: [Yes/No]
[Similar format]
| Metric | Before | After (Est.) |
|---|---|---|
| Execution Model | Imperative | Declarative |
| Parallel Potential | Low | High |
| Data Movement | High | Low |
Would you like me to apply the X auto-fixable optimizations?
## Examples
### Analyze Performance
/sqlscript-optimize src/procedures/process_orders.sql
### Analyze with Detailed Explanations
/sqlscript-optimize src/procedures/process_orders.sql --explain
### Analyze and Apply Fixes
/sqlscript-optimize src/procedures/process_orders.sql --fix
## Common Optimizations
### Cursor Loop to Set-Based
```sql
-- BEFORE (Slow: Row-by-row)
FOR row AS cur DO
UPDATE orders SET status = 'PROCESSED' WHERE id = row.id;
END FOR;
-- AFTER (Fast: Set-based)
UPDATE orders SET status = 'PROCESSED'
WHERE id IN (SELECT id FROM :lt_ids);
-- BEFORE (Slow: Subquery per row)
SELECT
id,
(SELECT name FROM customers WHERE id = o.customer_id) as customer_name
FROM orders o;
-- AFTER (Fast: Single JOIN)
SELECT o.id, c.name as customer_name
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.id;
-- BEFORE (Slow: Removes duplicates)
SELECT id FROM table1
UNION
SELECT id FROM table2;
-- AFTER (Fast: No deduplication when not needed)
SELECT id FROM table1
UNION ALL
SELECT id FROM table2;
-- BEFORE (Slow: Filter after join)
lt_result = SELECT * FROM t1 JOIN t2 ON t1.id = t2.id;
lt_filtered = SELECT * FROM :lt_result WHERE status = 'A';
-- AFTER (Fast: Filter in source)
lt_result = SELECT * FROM t1
JOIN t2 ON t1.id = t2.id
WHERE t1.status = 'A';
When this command is invoked:
--fix specified, apply safe transformations