Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Instrução de atualização simples para que todas as linhas recebam um valor diferente


Em alguma mesa de teste, meu plano original é o seguinte.



Ele apenas calcula o resultado uma vez e o armazena em um sppol e, em seguida, reproduz esse resultado. Você pode tentar o seguinte para que o SQL Server veja a subconsulta como correlacionada e precisando ser reavaliada para cada linha externa.
UPDATE table1
SET    table2Id = (SELECT TOP 1 table2Id
                   FROM   table2
                   ORDER  BY Newid(),
                             table1.table1Id)

Para mim isso dá esse plano sem o carretel.



É importante correlacionar em um campo exclusivo de table1 no entanto, mesmo que um carretel seja adicionado, ele sempre deve ser rebobinado em vez de rebobinado (reproduzindo o último resultado), pois o valor de correlação será diferente para cada linha.

Se as tabelas forem grandes isto será lento pois o trabalho necessário é um produto das duas linhas da tabela (para cada linha em table1 ele precisa fazer uma varredura completa de table2 )