Window Functions Fundamentals: Performance
Module: Window Functions
**Performance Optimization Strategies:**
**1. Indexing Strategy:**
```sql
-- For PARTITION BY columns
CREATE INDEX idx_employees_dept ON employees(department);
-- For ORDER BY columns
CREATE INDEX idx_employees_hire_date ON employees(hire_date);
-- For combined PARTITION BY + ORDER BY
CREATE INDEX idx_employees_dept_hire ON employees(department, hire_date);
```
**2. Performance Benchmarks (1M row table):**
| Query Type | Execution Time | Memory Usage |
|------------|----------------|---------------|
| Simple window function | 2.3s | 150MB |
| Equivalent correlated subquery | 45.2s | 300MB |
| GROUP BY (summary only) | 0.8s | 50MB |
| Multiple window functions | 4.1s | 200MB |
**3. Best Practices:**
- **Index PARTITION BY and ORDER BY columns** - 10x performance improvement
- **Limit result sets** - Use WHERE clauses before window functions
- **Use CTEs for readability** - Break complex queries into steps
- **Consider materialized views** - For frequently-used window calculations
- **Monitor memory usage** - Large partitions can consume significant RAM
**4. Database-Specific Optimizations:**
- **PostgreSQL**: Excellent window function optimization, supports all features
- **MySQL 8.0+**: Good performance, full window function support
- **SQL Server**: Optimized execution plans, consider columnstore indexes
- **Oracle**: Advanced window functions, partition-wise joins
**5. Anti-Patterns to Avoid:**
❌ **Don't do this:**
```sql
-- Inefficient: No indexes, large result set
SELECT *, COUNT(*) OVER() FROM huge_table;
```
✅ **Do this instead:**
```sql
-- Efficient: Filtered, indexed, specific columns
SELECT id, name, COUNT(*) OVER()
FROM huge_table
WHERE date_column >= '2024-01-01';