""" Revision ID: 0320_optimise_notifications Revises: 0319_contact_list_archived Create Date: 2020-03-26 11:16:12.389524 """ import os from alembic import op revision = "0320_optimise_notifications" down_revision = "0319_contact_list_archived" environment = os.environ["NOTIFY_ENVIRONMENT"] def upgrade(): # We like to run this operation on live via the command prompt, to watch the progress and stop if necessary if environment not in ["live", "production"]: # Drop indexes notifications - no need to recreate these indexes op.execute("DROP INDEX IF EXISTS ix_notifications_key_type") op.execute("DROP INDEX IF EXISTS ix_notifications_api_key_id") op.execute("DROP INDEX IF EXISTS ix_notifications_notification_status") op.execute("DROP INDEX IF EXISTS ix_notifications_notification_type") op.execute("DROP INDEX IF EXISTS ix_notifications_service_id") # Create new composite indexes # PLEASE NOTE: that if you create index on production you need to add concurrently to the create statement, # however we are unable to do that inside a transaction like this upgrade method ix_notifications_service_id_composite = """ CREATE INDEX ix_notifications_service_id_composite on notifications (service_id, notification_type, notification_status, created_at) """ op.execute(ix_notifications_service_id_composite) ix_notifications_notification_type_composite = """ CREATE INDEX ix_notifications_notification_type_composite on notifications (notification_type, notification_status, created_at) """ op.execute(ix_notifications_notification_type_composite) # DROP and CREATE all other indexes op.execute("DROP INDEX IF EXISTS ix_notifications_client_reference") op.execute( "CREATE INDEX ix_notifications_client_reference ON notifications (client_reference)" ) op.execute("DROP INDEX IF EXISTS ix_notifications_created_at") op.execute( "CREATE INDEX ix_notifications_created_at ON notifications (created_at)" ) op.execute("DROP INDEX IF EXISTS ix_notifications_job_id") op.execute("CREATE INDEX ix_notifications_job_id ON notifications (job_id)") op.execute("DROP INDEX IF EXISTS ix_notifications_reference") op.execute( "CREATE INDEX ix_notifications_reference ON notifications (reference)" ) op.execute("DROP INDEX IF EXISTS ix_notifications_service_created_at") op.execute( "CREATE INDEX ix_notifications_service_created_at ON notifications (service_id, created_at)" ) op.execute("DROP INDEX IF EXISTS ix_notifications_template_id") op.execute( "CREATE INDEX ix_notifications_template_id ON notifications (template_id)" ) # Drop indexes notification_history op.execute("DROP INDEX IF EXISTS ix_notification_history_key_type") op.execute("DROP INDEX IF EXISTS ix_notification_history_api_key_id") op.execute("DROP INDEX IF EXISTS ix_notification_history_notification_status") op.execute("DROP INDEX IF EXISTS ix_notification_history_notification_type") op.execute("DROP INDEX IF EXISTS ix_notification_history_service_id") op.execute("DROP INDEX IF EXISTS ix_notification_history_week_created") def downgrade(): pass