sql >> Base de Datos >  >> RDS >> Sqlserver

Declaración de actualización simple para que a todas las filas se les asigne un valor diferente

En alguna tabla de prueba, mi final, su plan original se ve de la siguiente manera.

Simplemente calcula el resultado una vez y lo almacena en caché en un sppol y luego reproduce ese resultado. Podría intentar lo siguiente para que SQL Server vea la subconsulta como correlacionada y necesitada de volver a evaluar para cada fila exterior.

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

Para mí que da este plan sin el carrete.

Es importante correlacionar en un campo único de table1 sin embargo, incluso si se agrega un carrete, siempre se debe rebobinar en lugar de rebobinar (reproducir el último resultado), ya que el valor de correlación será diferente para cada fila.

Si las tablas son grandes, esto será lento ya que el trabajo requerido es producto de las dos filas de la tabla (para cada fila en table1 necesita hacer un escaneo completo de table2 )