Я знаю, что это старый пост, но я думаю, что это очень важная тема, особенно в наши дни, когда у нас более 10 миллионов записей и мы говорим о терабайтах данных.
Я также остановлюсь на следующих наблюдениях. У меня около 45 миллионов записей в моей таблице ([data]) и около 300 записей в моей таблице [cats]. У меня есть обширная индексация для всех запросов, о которых я собираюсь рассказать.
Рассмотрим пример 1:
UPDATE d set category = c.categoryname
FROM [data] d
JOIN [cats] c on c.id = d.catid
по сравнению с примером 2:
UPDATE d set category = (SELECT TOP(1) c.categoryname FROM [cats] c where c.id = d.catid)
FROM [data] d
Выполнение примера 1 заняло около 23 минут. Пример 2 занял около 5 минут.
Итак, я бы сделал вывод, что подзапрос в этом случае выполняется намного быстрее. Конечно, имейте в виду, что я использую твердотельные накопители M.2 с возможностью ввода-вывода @ 1 ГБ / сек (это байты, а не биты), поэтому мои индексы тоже очень быстрые. Так что это может повлиять и на скорость в ваших обстоятельствах
Если это разовая очистка данных, вероятно, лучше всего просто оставить ее запущенной и закончить. Я использую TOP (10000) и смотрю, сколько времени это займет, и умножаю на количество записей, прежде чем попаду в большой запрос.
Если вы оптимизируете производственные базы данных, я настоятельно рекомендую выполнить предварительную обработку данных, то есть использовать триггеры или брокера заданий для асинхронного обновления записей, чтобы доступ в реальном времени извлекал статические данные.