Я знаю, что это старый пост, но я думаю, что это очень важная тема, особенно в наши дни, когда у нас 10 миллионов записей и мы говорим о терабайтах данных.
Я также расскажу о следующих наблюдениях. У меня около 45 миллионов записей в моей таблице ([данные]) и около 300 записей в моей таблице [кошки]. У меня есть обширная индексация для всех запросов, о которых я собираюсь поговорить.
Рассмотрим пример 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 минут.
Итак, я бы пришел к выводу, что подзапрос в этом случае намного быстрее. Конечно, имейте в виду, что я использую SSD-накопители M.2, способные работать со скоростью ввода / вывода @ 1 ГБ / с (то есть, байты, а не биты), поэтому мои индексы тоже очень быстрые. Так что это может повлиять и на скорость в ваших обстоятельствах
Если это однократная очистка данных, возможно, лучше просто оставить ее запущенной и завершенной. Я использую TOP (10000) и вижу, сколько времени потребуется, и умножаю его на количество записей, прежде чем я выполню большой запрос.
Если вы оптимизируете производственные базы данных, я бы настоятельно рекомендовал предварительно обрабатывать данные, т. Е. Использовать триггеры или посредник заданий для асинхронизации обновленных записей, чтобы в режиме реального времени доступ извлекал статические данные.