На някои тестови таблици от моя страна вашият оригинален план изглежда по следния начин.
Той просто изчислява резултата веднъж и го кешира в sppol, след което възпроизвежда този резултат. Можете да опитате следното, така че SQL Server да вижда подзаявката като корелирана и нуждаеща се от преоценка за всеки външен ред.
UPDATE table1
SET table2Id = (SELECT TOP 1 table2Id
FROM table2
ORDER BY Newid(),
table1.table1Id)
За мен това дава този план без макарата.
Важно е да се направи корелация в уникално поле от table1
но така, че дори ако се добави макара, тя винаги трябва да се връща назад, а не да се навива (възпроизвеждане на последния резултат), тъй като корелационната стойност ще бъде различна за всеки ред.
Ако таблиците са големи, това ще бъде бавно, тъй като необходимата работа е продукт на двата реда на таблицата (за всеки ред в table1
трябва да направи пълно сканиране на table2
)