LEAD, LAG, FIRST_VALUE, LAST_VALUE: Performance
Module: Window Functions
**Performance Optimization:**
**Indexing Strategy:**
```sql
-- For PARTITION BY + ORDER BY queries
CREATE INDEX idx_sales_customer_date ON sales(customer_id, order_date);
-- For ORDER BY only queries
CREATE INDEX idx_stock_date ON stock_prices(trading_date);
```
**Performance Benchmarks (1M row table):**
| Function Combination | Execution Time | Memory Usage |
|---------------------|----------------|---------------|
| LAG only | 1.2s | 50MB |
| LEAD only | 1.3s | 52MB |
| FIRST_VALUE (full frame) | 2.1s | 120MB |
| LAST_VALUE (full frame) | 2.3s | 125MB |
| All four functions | 3.8s | 180MB |
**Frame Specification Impact:**
| Frame Type | Performance | Use Case |
|------------|-------------|----------|
| Default frame | Fastest | Running calculations |
| Full partition | Medium | Boundary comparisons |
| Moving window | Slowest | Sliding calculations |
**Optimization Tips:**
1. **Index ORDER BY columns** - Critical for all window functions
2. **Index PARTITION BY columns** - Enables efficient grouping
3. **Use appropriate frame specifications** - Don't use full frame if not needed
4. **Filter before windowing** - Use WHERE to reduce dataset size
5. **Combine functions efficiently** - Multiple functions in one query share work
**Memory Considerations:**
- **LAG/LEAD**: Minimal memory (just offset tracking)
- **FIRST_VALUE**: Medium memory (needs to remember first value)
- **LAST_VALUE**: Higher memory (needs to scan entire frame)
- **Full frames**: Require buffering entire partition
**Best Practices:**
- **Always specify frames for FIRST_VALUE/LAST_VALUE** when you need boundary values
- **Use meaningful default values** for LAG/LEAD
- **Test frame specifications** with small datasets first
- **Monitor query performance** as data grows
- **Consider materialized views** for frequently-used calculations
**Anti-Patterns:**