Я знаю, що це старий пост, але я вважаю, що це дуже важлива тема, особливо в наші дні, коли ми маємо записи 10M + і говоримо про терабайти даних.
Я також зважуюсь на наступні спостереження. У мене в таблиці близько 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 хв.
Тож я б зробив висновок, що підзапит у цьому випадку відбувається набагато швидше. Звичайно, майте на увазі, що я використовую M.2 SSD-накопичувачі, здатні ввімкнути 1 Гб / сек (цей байт не є бітами), тому мої індекси теж дуже швидкі. Тож це може вплинути на швидкість теж у ваших обставинах
Якщо це одноразове очищення даних, мабуть, найкраще просто залишити його запуск і закінчити. Я використовую TOP (10000) і дивлюся, скільки часу займає і помножую на кількість записів, перш ніж потрапити на великий запит.
Якщо ви оптимізуєте виробничі бази даних, я настійно пропоную попередню обробку даних, тобто використовувати тригери або брокер для асинхронізації записів оновлення, щоб доступ у реальному часі отримував статичні дані.