Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
github avatar

Sql Optimization

  • 13.5k installs
  • 37.1k repo stars
  • Updated July 28, 2026
  • github/awesome-copilot

sql-optimization is a skill for comprehensive SQL query tuning and database performance analysis across all SQL databases.

About

sql-optimization is a skill for comprehensive SQL query tuning and database performance analysis. It covers execution plan analysis, indexing strategies, pagination optimization, and batch operations. Developers use it during Build and Ship phases when optimizing database queries and implementing indexing for production systems.

  • Universal SQL performance optimization across MySQL, PostgreSQL, SQL Server, and Oracle
  • Execution plan analysis, pagination optimization, and batch operations guidance
  • Query pattern examples with index strategy recommendations

Sql Optimization by the numbers

  • 13,476 all-time installs (skills.sh)
  • +237 installs in the week ending Jul 28, 2026 (Skillselion tracking)
  • Ranked #16 of 923 Databases skills by installs in the Skillselion catalog
  • Security screen: MEDIUM risk (skills.sh audit)
  • Data as of Jul 28, 2026 (Skillselion catalog sync)
At a glance

sql-optimization capabilities & compatibility

Capabilities
query analysis · index design · execution plan review · performance tuning
Use cases
database
From the docs

What sql-optimization says it does

Provides execution plan analysis, pagination optimization, batch operations, and performance monitoring guidance.
API listing
npx skills add https://github.com/github/awesome-copilot --skill sql-optimization

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs13.5k
repo stars37.1k
Security audit3 / 3 scanners passed
Last updatedJuly 28, 2026
Repositorygithub/awesome-copilot

How do you optimize slow SQL queries across databases?

Optimize SQL queries and implement indexing strategies for production database systems during development and performance review.

Who is it for?

Backend developers optimizing database queries, implementing efficient indexing strategies, and analyzing execution plans for production systems.

Skip if: NoSQL databases; teams not using SQL; queries already highly optimized or performance-unconstrained applications.

When should I use this skill?

User reports slow queries, missing indexes, bad pagination, or asks for SQL execution plan optimization.

What you get

Rewritten queries, index recommendations, execution plan fixes, and batch operation improvements with monitoring guidance.

  • Optimized query
  • Index creation statements
  • Performance metrics

By the numbers

  • Covers MySQL, PostgreSQL, SQL Server, and Oracle optimization

Files

SKILL.mdMarkdownGitHub ↗

SQL Performance Optimization Assistant

Expert SQL performance optimization for ${selection} (or entire project if no selection). Focus on universal SQL optimization techniques that work across MySQL, PostgreSQL, SQL Server, Oracle, and other SQL databases.

🎯 Core Optimization Areas

Query Performance Analysis

-- ❌ BAD: Inefficient query patterns
SELECT * FROM orders o
WHERE YEAR(o.created_at) = 2024
  AND o.customer_id IN (
      SELECT c.id FROM customers c WHERE c.status = 'active'
  );

-- ✅ GOOD: Optimized query with proper indexing hints
SELECT o.id, o.customer_id, o.total_amount, o.created_at
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id
WHERE o.created_at >= '2024-01-01' 
  AND o.created_at < '2025-01-01'
  AND c.status = 'active';

-- Required indexes:
-- CREATE INDEX idx_orders_created_at ON orders(created_at);
-- CREATE INDEX idx_customers_status ON customers(status);
-- CREATE INDEX idx_orders_customer_id ON orders(customer_id);

Index Strategy Optimization

-- ❌ BAD: Poor indexing strategy
CREATE INDEX idx_user_data ON users(email, first_name, last_name, created_at);

-- ✅ GOOD: Optimized composite indexing
-- For queries filtering by email first, then sorting by created_at
CREATE INDEX idx_users_email_created ON users(email, created_at);

-- For full-text name searches
CREATE INDEX idx_users_name ON users(last_name, first_name);

-- For user status queries
CREATE INDEX idx_users_status_created ON users(status, created_at)
WHERE status IS NOT NULL;

Subquery Optimization

-- ❌ BAD: Correlated subquery
SELECT p.product_name, p.price
FROM products p
WHERE p.price > (
    SELECT AVG(price) 
    FROM products p2 
    WHERE p2.category_id = p.category_id
);

-- ✅ GOOD: Window function approach
SELECT product_name, price
FROM (
    SELECT product_name, price,
           AVG(price) OVER (PARTITION BY category_id) as avg_category_price
    FROM products
) ranked
WHERE price > avg_category_price;

📊 Performance Tuning Techniques

JOIN Optimization

-- ❌ BAD: Inefficient JOIN order and conditions
SELECT o.*, c.name, p.product_name
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.id
LEFT JOIN order_items oi ON o.id = oi.order_id
LEFT JOIN products p ON oi.product_id = p.id
WHERE o.created_at > '2024-01-01'
  AND c.status = 'active';

-- ✅ GOOD: Optimized JOIN with filtering
SELECT o.id, o.total_amount, c.name, p.product_name
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id AND c.status = 'active'
INNER JOIN order_items oi ON o.id = oi.order_id
INNER JOIN products p ON oi.product_id = p.id
WHERE o.created_at > '2024-01-01';

Pagination Optimization

-- ❌ BAD: OFFSET-based pagination (slow for large offsets)
SELECT * FROM products 
ORDER BY created_at DESC 
LIMIT 20 OFFSET 10000;

-- ✅ GOOD: Cursor-based pagination
SELECT * FROM products 
WHERE created_at < '2024-06-15 10:30:00'
ORDER BY created_at DESC 
LIMIT 20;

-- Or using ID-based cursor
SELECT * FROM products 
WHERE id > 1000
ORDER BY id 
LIMIT 20;

Aggregation Optimization

-- ❌ BAD: Multiple separate aggregation queries
SELECT COUNT(*) FROM orders WHERE status = 'pending';
SELECT COUNT(*) FROM orders WHERE status = 'shipped';
SELECT COUNT(*) FROM orders WHERE status = 'delivered';

-- ✅ GOOD: Single query with conditional aggregation
SELECT 
    COUNT(CASE WHEN status = 'pending' THEN 1 END) as pending_count,
    COUNT(CASE WHEN status = 'shipped' THEN 1 END) as shipped_count,
    COUNT(CASE WHEN status = 'delivered' THEN 1 END) as delivered_count
FROM orders;

🔍 Query Anti-Patterns

SELECT Performance Issues

-- ❌ BAD: SELECT * anti-pattern
SELECT * FROM large_table lt
JOIN another_table at ON lt.id = at.ref_id;

-- ✅ GOOD: Explicit column selection
SELECT lt.id, lt.name, at.value
FROM large_table lt
JOIN another_table at ON lt.id = at.ref_id;

WHERE Clause Optimization

-- ❌ BAD: Function calls in WHERE clause
SELECT * FROM orders 
WHERE UPPER(customer_email) = 'JOHN@EXAMPLE.COM';

-- ✅ GOOD: Index-friendly WHERE clause
SELECT * FROM orders 
WHERE customer_email = 'john@example.com';
-- Consider: CREATE INDEX idx_orders_email ON orders(LOWER(customer_email));

OR vs UNION Optimization

-- ❌ BAD: Complex OR conditions
SELECT * FROM products 
WHERE (category = 'electronics' AND price < 1000)
   OR (category = 'books' AND price < 50);

-- ✅ GOOD: UNION approach for better optimization
SELECT * FROM products WHERE category = 'electronics' AND price < 1000
UNION ALL
SELECT * FROM products WHERE category = 'books' AND price < 50;

📈 Database-Agnostic Optimization

Batch Operations

-- ❌ BAD: Row-by-row operations
INSERT INTO products (name, price) VALUES ('Product 1', 10.00);
INSERT INTO products (name, price) VALUES ('Product 2', 15.00);
INSERT INTO products (name, price) VALUES ('Product 3', 20.00);

-- ✅ GOOD: Batch insert
INSERT INTO products (name, price) VALUES 
('Product 1', 10.00),
('Product 2', 15.00),
('Product 3', 20.00);

Temporary Table Usage

-- ✅ GOOD: Using temporary tables for complex operations
CREATE TEMPORARY TABLE temp_calculations AS
SELECT customer_id, 
       SUM(total_amount) as total_spent,
       COUNT(*) as order_count
FROM orders 
WHERE created_at >= '2024-01-01'
GROUP BY customer_id;

-- Use the temp table for further calculations
SELECT c.name, tc.total_spent, tc.order_count
FROM temp_calculations tc
JOIN customers c ON tc.customer_id = c.id
WHERE tc.total_spent > 1000;

🛠️ Index Management

Index Design Principles

-- ✅ GOOD: Covering index design
CREATE INDEX idx_orders_covering 
ON orders(customer_id, created_at) 
INCLUDE (total_amount, status);  -- SQL Server syntax
-- Or: CREATE INDEX idx_orders_covering ON orders(customer_id, created_at, total_amount, status); -- Other databases

Partial Index Strategy

-- ✅ GOOD: Partial indexes for specific conditions
CREATE INDEX idx_orders_active 
ON orders(created_at) 
WHERE status IN ('pending', 'processing');

📊 Performance Monitoring Queries

Query Performance Analysis

-- Generic approach to identify slow queries
-- (Specific syntax varies by database)

-- For MySQL:
SELECT query_time, lock_time, rows_sent, rows_examined, sql_text
FROM mysql.slow_log
ORDER BY query_time DESC;

-- For PostgreSQL:
SELECT query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY total_time DESC;

-- For SQL Server:
SELECT 
    qs.total_elapsed_time/qs.execution_count as avg_elapsed_time,
    qs.execution_count,
    SUBSTRING(qt.text, (qs.statement_start_offset/2)+1,
        ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.text)
        ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) as query_text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY avg_elapsed_time DESC;

🎯 Universal Optimization Checklist

Query Structure

  • [ ] Avoiding SELECT * in production queries
  • [ ] Using appropriate JOIN types (INNER vs LEFT/RIGHT)
  • [ ] Filtering early in WHERE clauses
  • [ ] Using EXISTS instead of IN for subqueries when appropriate
  • [ ] Avoiding functions in WHERE clauses that prevent index usage

Index Strategy

  • [ ] Creating indexes on frequently queried columns
  • [ ] Using composite indexes in the right column order
  • [ ] Avoiding over-indexing (impacts INSERT/UPDATE performance)
  • [ ] Using covering indexes where beneficial
  • [ ] Creating partial indexes for specific query patterns

Data Types and Schema

  • [ ] Using appropriate data types for storage efficiency
  • [ ] Normalizing appropriately (3NF for OLTP, denormalized for OLAP)
  • [ ] Using constraints to help query optimizer
  • [ ] Partitioning large tables when appropriate

Query Patterns

  • [ ] Using LIMIT/TOP for result set control
  • [ ] Implementing efficient pagination strategies
  • [ ] Using batch operations for bulk data changes
  • [ ] Avoiding N+1 query problems
  • [ ] Using prepared statements for repeated queries

Performance Testing

  • [ ] Testing queries with realistic data volumes
  • [ ] Analyzing query execution plans
  • [ ] Monitoring query performance over time
  • [ ] Setting up alerts for slow queries
  • [ ] Regular index usage analysis

📝 Optimization Methodology

1. Identify: Use database-specific tools to find slow queries 2. Analyze: Examine execution plans and identify bottlenecks 3. Optimize: Apply appropriate optimization techniques 4. Test: Verify performance improvements 5. Monitor: Continuously track performance metrics 6. Iterate: Regular performance review and optimization

Focus on measurable performance improvements and always test optimizations with realistic data volumes and query patterns.

Related skills

How it compares

Pick sql-optimization for cross-engine SQL tuning advice rather than single-database GUI profilers.

FAQ

What databases does sql-optimization cover?

sql-optimization provides universal techniques working across MySQL, PostgreSQL, SQL Server, Oracle, and other SQL databases.

When should I use composite vs single-column indexes?

Composite indexes are most effective when queries filter on multiple columns in sequence, especially when the first column is most selective.

Is Sql Optimization safe to install?

skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

Databasesdatabases

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.