diff --git a/priv/repo/migrations/20260325180211_add_missing_fk_indexes.exs b/priv/repo/migrations/20260325180211_add_missing_fk_indexes.exs new file mode 100644 index 00000000..4c34b6dd --- /dev/null +++ b/priv/repo/migrations/20260325180211_add_missing_fk_indexes.exs @@ -0,0 +1,44 @@ +defmodule Towerops.Repo.Migrations.AddMissingFkIndexes do + use Ecto.Migration + + @disable_ddl_transaction true + @disable_migration_lock true + + def up do + # Create indexes concurrently to avoid locking tables in production + # These foreign keys were missing indexes, causing slow DELETEs/UPDATEs + # on parent tables and slow JOINs + + # on_call_overrides.user_id -> users.id + create_if_not_exists index(:on_call_overrides, [:user_id], concurrently: true) + + # on_call_layer_members.user_id -> users.id + create_if_not_exists index(:on_call_layer_members, [:user_id], concurrently: true) + + # site_outages.site_id -> sites.id + create_if_not_exists index(:site_outages, [:site_id], concurrently: true) + + # escalation_targets.user_id -> users.id + create_if_not_exists index(:escalation_targets, [:user_id], concurrently: true) + + # notification_digests.organization_id -> organizations.id + create_if_not_exists index(:notification_digests, [:organization_id], concurrently: true) + + # on_call_notifications.user_id -> users.id + create_if_not_exists index(:on_call_notifications, [:user_id], concurrently: true) + + # alerts.site_outage_id -> site_outages.id + create_if_not_exists index(:alerts, [:site_outage_id], concurrently: true) + end + + def down do + # Drop indexes in reverse order + drop_if_exists index(:alerts, [:site_outage_id], concurrently: true) + drop_if_exists index(:on_call_notifications, [:user_id], concurrently: true) + drop_if_exists index(:notification_digests, [:organization_id], concurrently: true) + drop_if_exists index(:escalation_targets, [:user_id], concurrently: true) + drop_if_exists index(:site_outages, [:site_id], concurrently: true) + drop_if_exists index(:on_call_layer_members, [:user_id], concurrently: true) + drop_if_exists index(:on_call_overrides, [:user_id], concurrently: true) + end +end