aios-core
Version:
Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework
573 lines (419 loc) • 12.9 kB
Markdown
# Task: Analyze Hot Query Paths
**Purpose**: Run EXPLAIN ANALYZE on common/critical queries to identify performance issues
**Elicit**: true
## Execution Modes
**Choose your execution mode:**
### 1. YOLO Mode - Fast, Autonomous (0-1 prompts)
- Autonomous decision making with logging
- Minimal user interaction
- **Best for:** Simple, deterministic tasks
### 2. Interactive Mode - Balanced, Educational (5-10 prompts) **[DEFAULT]**
- Explicit decision checkpoints
- Educational explanations
- **Best for:** Learning, complex decisions
### 3. Pre-Flight Planning - Comprehensive Upfront Planning
- Task analysis phase (identify all ambiguities)
- Zero ambiguity execution
- **Best for:** Ambiguous requirements, critical work
**Parameter:** `mode` (optional, default: `interactive`)
## Task Definition (AIOS Task Format V1.0)
```yaml
task: dbAnalyzeHotpaths()
responsável: Dara (Sage)
responsavel_type: Agente
atomic_layer: Strategy
**Entrada:**
- campo: query
tipo: string
origem: User Input
obrigatório: true
validação: Valid SQL query
- campo: params
tipo: object
origem: User Input
obrigatório: false
validação: Query parameters
- campo: connection
tipo: object
origem: config
obrigatório: true
validação: Valid PostgreSQL connection via Supabase
**Saída:**
- campo: query_result
tipo: array
destino: Memory
persistido: false
- campo: records_affected
tipo: number
destino: Return value
persistido: false
- campo: execution_time
tipo: number
destino: Memory
persistido: false
```
## Pre-Conditions
**Purpose:** Validate prerequisites BEFORE task execution (blocking)
**Checklist:**
```yaml
pre-conditions:
- [ ] Database connection established; query syntax valid
tipo: pre-condition
blocker: true
validação: |
Check database connection established; query syntax valid
error_message: "Pre-condition failed: Database connection established; query syntax valid"
```
## Post-Conditions
**Purpose:** Validate execution success AFTER task completes
**Checklist:**
```yaml
post-conditions:
- [ ] Query executed; results returned; transaction committed
tipo: post-condition
blocker: true
validação: |
Verify query executed; results returned; transaction committed
error_message: "Post-condition failed: Query executed; results returned; transaction committed"
```
## Acceptance Criteria
**Purpose:** Definitive pass/fail criteria for task completion
**Checklist:**
```yaml
acceptance-criteria:
- [ ] Data persisted correctly; constraints respected; no orphaned data
tipo: acceptance-criterion
blocker: true
validação: |
Assert data persisted correctly; constraints respected; no orphaned data
error_message: "Acceptance criterion not met: Data persisted correctly; constraints respected; no orphaned data"
```
## Tools
**External/shared resources used by this task:**
- **Tool:** neo4j-driver
- **Purpose:** Neo4j database connection and query execution
- **Source:** npm: neo4j-driver
- **Tool:** query-validator
- **Purpose:** Cypher query syntax validation
- **Source:** .aios-core/utils/db-query-validator.js
## Scripts
**Agent-specific code for this task:**
- **Script:** db-query.js
- **Purpose:** Execute Neo4j queries with error handling
- **Language:** JavaScript
- **Location:** .aios-core/scripts/db-query.js
## Error Handling
**Strategy:** fallback
**Common Errors:**
1. **Error:** Connection Failed
- **Cause:** Unable to connect to Neo4j database
- **Resolution:** Check connection string, credentials, network
- **Recovery:** Retry with exponential backoff (max 3 attempts)
2. **Error:** Query Syntax Error
- **Cause:** Invalid Cypher query syntax
- **Resolution:** Validate query syntax before execution
- **Recovery:** Return detailed syntax error, suggest fix
3. **Error:** Transaction Rollback
- **Cause:** Query violates constraints or timeout
- **Resolution:** Review query logic and constraints
- **Recovery:** Automatic rollback, preserve data integrity
## Performance
**Expected Metrics:**
```yaml
duration_expected: 5-20 min (estimated)
cost_estimated: $0.003-0.015
token_usage: ~2,000-8,000 tokens
```
**Optimization Notes:**
- Iterative analysis with depth limits; cache intermediate results; batch similar operations
## Metadata
```yaml
story: N/A
version: 1.0.0
dependencies:
- N/A
tags:
- database
- infrastructure
updated_at: 2025-11-17
```
## Inputs
- `queries_file` (optional): Path to file with labeled queries to analyze
- If not provided, analyze common patterns from pg_stat_statements
## Process
### 1. Enable Required Extensions
Ensure performance monitoring is available:
```bash
echo "Enabling performance extensions..."
psql "$SUPABASE_DB_URL" << 'EOF'
-- Enable pg_stat_statements (should already be enabled in Supabase)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- Optionally enable index_advisor (Supabase extension)
CREATE EXTENSION IF NOT EXISTS index_advisor;
SELECT 'Extensions ready' AS status;
EOF
echo "✓ Extensions enabled"
```
### 2. Identify Hot Queries
If no queries_file provided, find slowest queries from pg_stat_statements:
```bash
echo "Finding slow queries from pg_stat_statements..."
psql "$SUPABASE_DB_URL" << 'EOF'
SELECT
query,
calls,
ROUND(total_exec_time::numeric, 2) AS total_time_ms,
ROUND(mean_exec_time::numeric, 2) AS mean_time_ms,
ROUND(max_exec_time::numeric, 2) AS max_time_ms,
ROUND((100 * total_exec_time / SUM(total_exec_time) OVER ())::numeric, 2) AS pct_total_time
FROM pg_stat_statements
WHERE query NOT LIKE '%pg_stat_statements%'
AND query NOT LIKE '%pg_catalog%'
ORDER BY mean_exec_time DESC
LIMIT 20;
EOF
```
Ask user:
```
Top 20 slow queries found.
Select query numbers to analyze (comma-separated, e.g., 1,3,5):
Or type 'all' to analyze all:
```
### 3. Run EXPLAIN ANALYZE with BUFFERS
For each selected query, run comprehensive analysis:
```bash
echo "Analyzing query performance..."
# CRITICAL: Always use ANALYZE, BUFFERS for complete picture
psql "$SUPABASE_DB_URL" << 'EOF'
-- Query being analyzed
\echo '=========================================='
\echo 'QUERY: {query_label}'
\echo '=========================================='
-- Option 1: EXPLAIN ANALYZE with BUFFERS (recommended)
EXPLAIN (
ANALYZE true,
BUFFERS true,
VERBOSE true,
COSTS true,
TIMING true
)
{actual_query};
\echo ''
\echo 'BUFFERS LEGEND:'
\echo ' - shared hit = blocks found in buffer cache (good)'
\echo ' - shared read = blocks read from disk (bad if high)'
\echo ' - temp read/written = temporary files (bad if present)'
\echo ''
EOF
```
### 4. Generate Index Recommendations
Use index_advisor extension (Supabase-specific):
```bash
echo "Generating index recommendations..."
psql "$SUPABASE_DB_URL" << 'EOF'
-- Use index_advisor to get suggestions
SELECT *
FROM index_advisor('{actual_query}');
-- Alternative: Supabase Studio has Index Advisor UI
-- Navigate to: Query Performance Report → Select query → "indexes" tab
EOF
```
### 5. Analyze Results
Identify common performance issues:
```bash
echo "Performance Issue Checklist:"
echo ""
echo "🔍 Sequential Scans:"
echo " - Look for: 'Seq Scan on table_name'"
echo " - Problem if: Large tables (>1000 rows) + filter removes many rows"
echo " - Fix: Add index on filter columns"
echo ""
echo "🔍 Row Count Mismatches:"
echo " - Compare: rows=XXXX (estimated) vs actual rows=YYYY"
echo " - Problem if: Estimate differs by >10x from actual"
echo " - Fix: ANALYZE table_name; (update statistics)"
echo ""
echo "🔍 Buffer Cache Misses:"
echo " - Look for: 'shared read' in BUFFERS output"
echo " - Problem if: High compared to 'shared hit'"
echo " - Fix: Increase shared_buffers, optimize query, add indexes"
echo ""
echo "🔍 Temporary Files:"
echo " - Look for: 'temp read' or 'temp written' in BUFFERS"
echo " - Problem: Query using disk for sorting/hashing (work_mem too small)"
echo " - Fix: Increase work_mem, optimize query, add indexes"
echo ""
echo "🔍 Nested Loops:"
echo " - Look for: 'Nested Loop' with high row counts"
echo " - Problem if: Loops=10000+ iterations"
echo " - Fix: Add indexes on join columns, consider Hash Join"
echo ""
```
### 6. Create Analysis Report
Generate markdown report with findings:
```bash
REPORT_FILE="supabase/docs/performance-analysis-$(date +%Y%m%d%H%M%S).md"
mkdir -p supabase/docs
cat > "$REPORT_FILE" << 'MDEOF'
# Query Performance Analysis
**Date**: $(date -u +"%Y-%m-%d %H:%M:%S UTC")
**Database**: [redacted]
**Tool**: DB Sage db-analyze-hotpaths
## Executive Summary
- Queries analyzed: {count}
- Avg execution time: {avg_time}ms
- Indexes recommended: {index_count}
## Detailed Findings
### Query 1: {query_label}
**Current Performance:**
- Mean execution time: {mean_time}ms
- Calls: {calls}
- % of total time: {pct_time}%
**EXPLAIN ANALYZE Output:**
```
{explain_output}
```
**Issues Identified:**
1. {issue_1}
2. {issue_2}
**Recommended Indexes:**
```sql
{recommended_indexes}
```
**Expected Improvement:** {estimated_improvement}
[Repeat for each query...]
## Action Items
- [ ] Create migration for recommended indexes
- [ ] Update statistics: ANALYZE {tables}
- [ ] Re-run analysis after changes
- [ ] Monitor with pg_stat_statements
MDEOF
echo "✓ Report: $REPORT_FILE"
```
## Output
Display summary and next steps:
```
✅ HOT PATH ANALYSIS COMPLETE
Queries analyzed: {count}
Report: supabase/docs/performance-analysis-{timestamp}.md
Key Findings:
- {finding_1}
- {finding_2}
- {finding_3}
Recommended Actions:
1. Review report: cat {report_file}
2. Create index migration for recommended indexes
3. Update statistics: ANALYZE {affected_tables}
4. Re-run analysis: *analyze-hotpaths
Index Recommendations:
{list of CREATE INDEX statements}
```
## Common Query Patterns to Check
### Pattern 1: User-Specific Data
```sql
-- Hot path: Get user's posts
SELECT * FROM posts WHERE user_id = 'xxx';
-- Check: Index on user_id exists?
-- Verify: USING (auth.uid() = user_id) is wrapped in SELECT for RLS performance
```
### Pattern 2: Joins
```sql
-- Hot path: Posts with author info
SELECT p.*, u.name
FROM posts p
JOIN users u ON p.user_id = u.id;
-- Check: Index on posts(user_id)? Index on users(id) should exist (PK)
```
### Pattern 3: Filters + Sorts
```sql
-- Hot path: Recent published posts
SELECT * FROM posts
WHERE status = 'published'
ORDER BY created_at DESC
LIMIT 10;
-- Check: Index on (status, created_at DESC)?
```
### Pattern 4: Aggregations
```sql
-- Hot path: User post count
SELECT user_id, COUNT(*)
FROM posts
GROUP BY user_id;
-- Check: Index on user_id? Or denormalize count?
```
## BUFFERS Output Interpretation
**Good (Cached):**
```
Buffers: shared hit=100
```
= 100 blocks found in cache (no disk I/O)
**Bad (Disk Reads):**
```
Buffers: shared hit=10 read=990
```
= Only 10 blocks cached, 990 read from disk
**Very Bad (Temp Files):**
```
Buffers: temp read=5000 written=5000
```
= Query spilled to disk (work_mem too small)
**Target:** Maximize "shared hit", minimize "shared read", zero "temp"
## Supabase-Specific Notes
### Using with Supabase Client (PostgREST)
Enable explain in SQL editor first (dev only):
```sql
-- Run once in Dashboard SQL Editor
ALTER DATABASE postgres SET app.settings.explain TO 'on';
```
Then use in code:
```javascript
const { data, error } = await supabase
.from('posts')
.select('*')
.eq('status', 'published')
.explain({ analyze: true, buffers: true })
```
### Supabase Studio Integration
- Navigate to: **Query Performance Report**
- Select slow query
- Click **"indexes" tab** for index_advisor recommendations
- One-click to create migration
## Prerequisites
- pg_stat_statements extension enabled (default in Supabase)
- Sufficient database activity to populate statistics
- For index_advisor: index_advisor extension (Supabase Pro+)
## Best Practices
1. **Always use BUFFERS**: `EXPLAIN (ANALYZE, BUFFERS)`
2. **Look for patterns**: One slow query often indicates a systemic issue
3. **Update statistics**: Run `ANALYZE` after significant data changes
4. **Test indexes**: Create indexes CONCURRENTLY in production
5. **Re-measure**: After optimizations, re-run this analysis
6. **RLS Performance**: Wrap auth functions in SELECT for 19x speedup
## References
- [PostgreSQL EXPLAIN Documentation](https://www.postgresql.org/docs/current/sql-explain.html)
- [Supabase Query Optimization](https://supabase.com/docs/guides/database/query-optimization)
- [Supabase RLS Performance](https://supabase.com/docs/guides/troubleshooting/rls-performance-and-best-practices-Z5Jjwv)
- [index_advisor Extension](https://supabase.com/docs/guides/database/extensions/index_advisor)