sql >> Database >  >> RDS >> Sqlserver

Eenvoudige update-instructie zodat alle rijen een andere waarde krijgen

Op een testtafel ziet mijn oorspronkelijke plan er als volgt uit.

Het berekent het resultaat slechts één keer en slaat het op in een sppol en speelt dat resultaat vervolgens opnieuw af. U kunt het volgende proberen, zodat SQL Server de subquery als gecorreleerd ziet en voor elke buitenste rij opnieuw moet worden geëvalueerd.

UPDATE table1
SET    table2Id = (SELECT TOP 1 table2Id
                   FROM   table2
                   ORDER  BY Newid(),
                             table1.table1Id)

Voor mij geeft dat dit plan zonder de spoel.

Het is belangrijk om te correleren op een uniek veld uit table1 zodat zelfs als een spoel wordt toegevoegd, deze altijd moet worden teruggekaatst in plaats van teruggespoeld (het laatste resultaat wordt opnieuw afgespeeld), omdat de correlatiewaarde voor elke rij anders zal zijn.

Als de tabellen groot zijn, zal dit traag zijn omdat het vereiste werk een product is van de twee tabelrijen (voor elke rij in table1 het moet een volledige scan uitvoeren van table2 )



  1. Vermenigvuldiging van gegevens uit MySQL-rij

  2. Hoe te ontsnappen aan aanhalingstekens in MySQL en Java

  3. PostgreSQL in opkomst:Postgres-bevindingen 2018 en trends voor 2019

  4. Hoe SQLAlchemy-caching uit te schakelen?