""" 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