major-domo-database/.claude/sqlite-to-postgres/optimize_postgres.sql
Cal Corum 7130a1fd43 Postgres Migration
Migration documentation and scripts
2025-08-25 07:18:31 -05:00

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;