sql >> Database teknologi >  >> RDS >> Sqlserver

Enkel opdateringserklæring, så alle rækker tildeles en anden værdi

På et testbord hos mig ser din oprindelige plan ud som følger.

Den beregner bare resultatet én gang og cacher det i en sppol og afspiller derefter resultatet. Du kan prøve følgende, så SQL Server ser underforespørgslen som korreleret og har behov for reevaluering for hver ydre række.

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

For mig giver det denne plan uden spolen.

Det er vigtigt at korrelere på et unikt felt fra table1 dog således, at selvom en spole tilføjes, skal den altid spoles tilbage i stedet for tilbage (genafspilning af det sidste resultat), da korrelationsværdien vil være forskellig for hver række.

Hvis tabellerne er store vil dette være langsomt, da det nødvendige arbejde er et produkt af de to tabelrækker (for hver række i table1 den skal lave en fuld scanning af table2 )



  1. importer CSV til MySQL og konverter dato

  2. Flere planer for en identisk forespørgsel

  3. Hvad minder MS SQL Server-kapaciteten til MySQL FIELD()-funktionen?

  4. Opret en tabel med komprimering i SQL Server (T-SQL)