Пара изменений, в дополнение к тому, что сказал @Adrian ...
UPDATE
ud1 -- @Adrian's change. Update the instance that you have already aliased.
SET
externalEmail = ud2.Email
FROM
@user_dupes AS ud1
INNER JOIN
@user_flat_emailtable_dupes AS ud2
ON ud1.UserName = ud2.UserName
WHERE
ud2.EmailType = 2 -- Removed sub-query, for layout, doubt it will help performance
AND ud2.Email IS NOT NULL
AND ud2.Email <> '' -- Removed the `LEN()` function
Но, возможно, самое важное в прошлом - обеспечить наличие индексов.JOIN
необходим для этой логики (или связанных подзапросов и т. Д.), Поэтому вы хотите, чтобы соединение было производительным.
Индекс (UserName) для @user_dupes и Индекс (EmailType), Электронная почта, имя пользователя) на @user_flat_emailtable_dupes. (Предполагается, что ud2 - это меньшая таблица после фильтрации)
С указанными индексами изменение с LEN(Email) > 0
на Email <> ''
может разрешить поиск индекса, а не сканирование.Чем больше ваши столы, тем более очевидным будет это.