aprs.me/priv/repo/migrations/20250708140444_add_additional_performance_indexes.exs

52 lines
2.1 KiB
Elixir

defmodule Aprsme.Repo.Migrations.AddAdditionalPerformanceIndexes do
use Ecto.Migration
@disable_ddl_transaction true
@disable_migration_lock true
def up do
# Add compound indexes for common query patterns
create_if_not_exists index(:packets, [:received_at, :has_position, :data_type],
concurrently: true
)
create_if_not_exists index(:packets, [:sender, :data_type, :received_at], concurrently: true)
# Add index for weather symbol combinations (frequently used in queries)
execute """
CREATE INDEX CONCURRENTLY IF NOT EXISTS packets_weather_symbol_idx
ON packets (received_at DESC, lat, lon)
WHERE (symbol_table_id = '/' AND symbol_code = '_')
OR (symbol_table_id = '\\' AND symbol_code = '_')
"""
# Add partial index for recent packets with position (most common map query)
# Note: Removing time-based predicate as it's not immutable
execute """
CREATE INDEX CONCURRENTLY IF NOT EXISTS packets_recent_positioned_idx
ON packets (received_at DESC, lat, lon, sender)
WHERE has_position = true
"""
# Add index for callsign case-insensitive searches
execute """
CREATE INDEX CONCURRENTLY IF NOT EXISTS packets_sender_upper_idx
ON packets (UPPER(sender), received_at DESC)
"""
# Add composite index for region-based queries
create_if_not_exists index(:packets, [:region, :data_type, :received_at], concurrently: true)
# Add index for device lookups (performance optimization)
create_if_not_exists index(:packets, [:device_identifier, :received_at], concurrently: true)
end
def down do
execute "DROP INDEX IF EXISTS packets_device_identifier_received_at_idx"
execute "DROP INDEX IF EXISTS packets_region_data_type_received_at_idx"
execute "DROP INDEX IF EXISTS packets_sender_upper_idx"
execute "DROP INDEX IF EXISTS packets_recent_positioned_idx"
execute "DROP INDEX IF EXISTS packets_weather_symbol_idx"
execute "DROP INDEX IF EXISTS packets_sender_data_type_received_at_idx"
execute "DROP INDEX IF EXISTS packets_received_at_has_position_data_type_idx"
end
end