У меня есть процесс, который объединяет 40+ идентично структурированных баз данных в одну консолидированную базу данных, с той лишь разницей, что консолидированная база данных добавляет поле project_id в каждую таблицу.
Чтобы быть максимально эффективным, я стараюсь копировать / обновлять запись из исходных баз данных в консолидированную базу данных только в том случае, если она была добавлена / изменена. Я удаляю устаревшие записи из консолидированной базы данных, а затем копирую все несуществующие записи. Чтобы удалить устаревшие / измененные записи, я использую запрос, похожий на этот:
DELETE FROM <table>
WHERE NOT EXISTS (SELECT <primary keys>
FROM <source> b
WHERE ((<b.fields = a.fields>) or
(b.fields is null and a.fields is null)))
AND PROJECT_ID = <project_id>
По большей части это работает, но одна из таблиц в исходной базе данных содержит более 700 000 записей, и выполнение этого запроса занимает более часа.
Как сделать этот запрос более эффективным?