sql >> Databáze >  >> RDS >> Sqlserver

Jednoduchý příkaz aktualizace, takže všem řádkům je přiřazena jiná hodnota

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 )



  1. Různé uvozovky MySQL

  2. Odeberte dva dotazy ze stejné tabulky

  3. Optimalizujte pomalé agregáty v LATERÁLNÍM spojení

  4. Je připojení k databázi v této třídě znovu použitelné?