81 lines
4.1 KiB
SQL
81 lines
4.1 KiB
SQL
-- PostgreSQL Post-Migration Optimizations
|
|
-- Execute with: python -c "exec(open('run_optimization.py').read())"
|
|
|
|
-- 1. CRITICAL INDEXES (Most Important)
|
|
-- These are based on the most common query patterns and foreign key relationships
|
|
|
|
-- StratPlay table (largest table with complex queries)
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_stratplay_game_id ON stratplay (game_id);
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_stratplay_batter_id ON stratplay (batter_id);
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_stratplay_pitcher_id ON stratplay (pitcher_id);
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_stratplay_season_week ON stratplay (game_id, inning_num); -- For game order queries
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_stratplay_on_base_code ON stratplay (on_base_code); -- For situational hitting (bases loaded, etc.)
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_stratplay_composite ON stratplay (batter_id, game_id) WHERE pa = 1; -- For batting stats
|
|
|
|
-- Player table (frequently joined)
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_player_season ON player (season);
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_player_team_season ON player (team_id, season);
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_player_name ON player (name); -- For player searches
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_player_pos ON player (pos_1, season); -- For positional queries
|
|
|
|
-- BattingStat/PitchingStat tables (statistics queries)
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_battingstat_player_season ON battingstat (player_id, season);
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_battingstat_team_season ON battingstat (team_id, season);
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_battingstat_week ON battingstat (season, week);
|
|
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_pitchingstat_player_season ON pitchingstat (player_id, season);
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_pitchingstat_team_season ON pitchingstat (team_id, season);
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_pitchingstat_week ON pitchingstat (season, week);
|
|
|
|
-- Team table
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_team_season ON team (season);
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_team_abbrev_season ON team (abbrev, season);
|
|
|
|
-- StratGame table (game lookups)
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_stratgame_season_week ON stratgame (season, week);
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_stratgame_teams ON stratgame (away_team_id, home_team_id, season);
|
|
|
|
-- Decision table (pitcher decisions)
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_decision_pitcher_season ON decision (pitcher_id, season);
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_decision_game ON decision (game_id);
|
|
|
|
-- 2. PERFORMANCE OPTIMIZATIONS
|
|
|
|
-- Update table statistics (important after large data loads)
|
|
ANALYZE;
|
|
|
|
-- Set PostgreSQL-specific optimizations
|
|
-- Increase work_mem for complex queries (adjust based on available RAM)
|
|
-- SET work_mem = '256MB'; -- Uncomment if you have sufficient RAM
|
|
|
|
-- Enable parallel query execution for large aggregations
|
|
-- SET max_parallel_workers_per_gather = 2; -- Uncomment if you have multiple CPU cores
|
|
|
|
-- 3. MAINTENANCE OPTIMIZATIONS
|
|
|
|
-- Enable auto-vacuum for better ongoing performance
|
|
-- (Should already be enabled by default in PostgreSQL)
|
|
|
|
-- Create partial indexes for common filtered queries
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_stratplay_bases_loaded
|
|
ON stratplay (batter_id, game_id)
|
|
WHERE on_base_code = '111'; -- Bases loaded situations
|
|
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_player_active
|
|
ON player (id, season)
|
|
WHERE team_id IS NOT NULL; -- Active players only
|
|
|
|
-- 4. QUERY-SPECIFIC INDEXES
|
|
|
|
-- For season-based aggregation queries (common in stats APIs)
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_battingstat_season_aggregate
|
|
ON battingstat (season, player_id, team_id);
|
|
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_pitchingstat_season_aggregate
|
|
ON pitchingstat (season, player_id, team_id);
|
|
|
|
-- For transaction/draft queries
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_transaction_season ON transaction (season);
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_draftpick_season ON draftpick (season);
|
|
|
|
COMMIT; |