optimize-queries
Query Optimization Skill
Automatically analyze and optimize Supabase database queries for better performance.
Purpose
This skill analyzes slow-running queries, identifies bottlenecks, and implements optimizations including index creation, RLS policy improvements, and query restructuring.
When to Use
- User mentions slow query performance
- Requests for database optimization
- Reports of timeout errors
- Asks about improving query speed
- Discusses scalability concerns
Instructions
-
Identify Query Issues
- Request example of slow query
- Use EXPLAIN ANALYZE if possible
- Check for missing indexes
- Review RLS policy implementation
-
Analyze Execution Plan
- Look for sequential scans
- Identify expensive operations
- Check join strategies
- Evaluate row estimates vs actuals
-
Recommend Optimizations
- Suggest specific indexes with CREATE INDEX statements
- Optimize RLS policies by wrapping functions in SELECT
- Recommend query restructuring if needed
- Suggest materialized views for complex aggregations
-
Implement Changes
- Create migration file with optimizations
- Test changes in development
- Measure performance improvements
- Document optimization decisions
-
Verify Improvements
- Re-run EXPLAIN ANALYZE
- Compare execution times
- Check index usage stats
- Confirm no regressions
Examples
Example 1: Add Missing Index
-- Slow query
SELECT * FROM posts WHERE author_id = '...' AND published = true ORDER BY created_at DESC;
-- Solution: Add composite index
CREATE INDEX CONCURRENTLY idx_posts_author_published_created
ON posts(author_id, published, created_at DESC)
WHERE published = true;
Example 2: Optimize RLS Policy
-- Before: Function called per row
CREATE POLICY "policy" ON table_name
USING (auth.uid() = user_id);
-- After: Function called once
CREATE POLICY "policy" ON table_name
USING ((SELECT auth.uid()) = user_id);
Example 3: Materialized View for Aggregations
CREATE MATERIALIZED VIEW user_stats AS
SELECT
user_id,
COUNT(*) as post_count,
MAX(created_at) as last_post
FROM posts
GROUP BY user_id;
CREATE INDEX ON user_stats(user_id);
REFRESH MATERIALIZED VIEW CONCURRENTLY user_stats;
Output Format
Provide:
- Analysis of current query performance
- Specific optimization recommendations with SQL
- Expected performance improvements
- Migration script with optimizations
- Testing instructions
More from rdimascio/supabase-marketplace
implement-crud
Implement complete CRUD (Create, Read, Update, Delete) operations for Supabase tables with proper error handling, validation, and RLS. Triggers when user requests data operations, API endpoints, or database interactions.
1design-schema
Design complete database schemas with tables, relationships, constraints, and indexes for Supabase. Triggers when user describes data models, entities, or requests schema design.
1setup-rls
Configure Row Level Security policies for Supabase tables to control data access. Triggers when user mentions security, permissions, access control, or RLS policies.
1manage-transactions
Implement PostgreSQL transactions for atomic operations in Supabase. Triggers when user needs atomic updates, batch operations, or mentions transactions, rollbacks, or data consistency.
1