Убедитесь, что у вас есть индекс, который охватывает этот запрос. То есть убедитесь, что table1.id
и table2.id
проиндексированы (да, этот индекс ускорит удаление даже при том, что индексы нужно будет обновить.) Это поможет с JOIN
.
Кроме того, возможно, вы захотите проверить пакетное удаление,
WHILE <some_condition> BEGIN
DELETE TOP (1000) t2
FROM table2 t2
LEFT OUTER JOIN table1 t1 ON t2.id = t1.id
WHERE t1.id IS NULL
END
Пакетирование ваших удалений уменьшит количество блокировок, которые SQL-сервер будет вынужден выполнять для ваших табличных, кластерных и некластеризованных индексов. Если это рабочий сервер с 300 миллионами строк, я бы определенно посмотрел на ваши индексы и посчитал количество записей, которые, по вашему мнению, вы хотите удалить, прежде чем придумать стратегию удаления.
SELECT COUNT(*) FROM table2 t2
LEFT OUTER JOIN table1 t1 ON t2.id = t1.id
WHERE t1.id IS NULL
Кроме того, обратитесь к администраторам любого сервера, чтобы узнать, что они думают о потенциальных проблемах с блокировкой.