Na nějakém testovacím stole můj konec vypadá váš původní plán následovně.
Pouze jednou vypočítá výsledek a uloží jej do mezipaměti v sppol a poté tento výsledek přehraje. Můžete zkusit následující, aby SQL Server viděl poddotaz jako korelovaný a potřebuje přehodnocení pro každý vnější řádek.
UPDATE table1
SET table2Id = (SELECT TOP 1 table2Id
FROM table2
ORDER BY Newid(),
table1.table1Id)
Pro mě to dává tento plán bez cívky.
Je důležité korelovat s jedinečným polem z table1
nicméně tak, že i když je cívka přidána, musí být vždy odražena, nikoli převinuta (přehrání posledního výsledku), protože hodnota korelace bude pro každý řádek jiná.
Pokud jsou tabulky velké, bude to pomalé, protože požadovaná práce je součinem dvou řádků tabulky (pro každý řádek v table1
potřebuje provést úplnou kontrolu table2
)