Questa è una versione modificata della risposta di @Aleksandr Fedorenko che aggiunge una clausola WHERE:
UPDATE x
SET x.CODE_DEST = x.New_CODE_DEST
FROM (
SELECT CODE_DEST, ROW_NUMBER() OVER (ORDER BY [RS_NOM]) AS New_CODE_DEST
FROM DESTINATAIRE_TEMP
) x
WHERE x.CODE_DEST <> x.New_CODE_DEST AND x.CODE_DEST IS NOT NULL
Aggiungendo una clausola WHERE ho riscontrato che le prestazioni sono migliorate notevolmente per gli aggiornamenti successivi. Sql Server sembra aggiornare la riga anche se il valore esiste già e ci vuole tempo per farlo, quindi l'aggiunta della clausola where fa saltare le righe in cui il valore non è cambiato. Devo dire che sono rimasto stupito dalla velocità con cui potrebbe eseguire la mia query.
Dichiarazione di non responsabilità: non sono un esperto di DB e sto usando PARTITION BY per la mia clausola, quindi potrebbe non essere esattamente lo stesso risultato per questa query. Per me la colonna in questione è l'ordine pagato di un cliente, quindi il valore generalmente non cambia una volta impostato.
Assicurati anche di avere gli indici, soprattutto se hai una clausola WHERE sull'istruzione SELECT. Un indice filtrato ha funzionato alla grande per me in quanto stavo filtrando in base agli stati di pagamento.
La mia query utilizzando PARTITION di
UPDATE UpdateTarget
SET PaidOrderIndex = New_PaidOrderIndex
FROM
(
SELECT PaidOrderIndex, SimpleMembershipUserName, ROW_NUMBER() OVER(PARTITION BY SimpleMembershipUserName ORDER BY OrderId) AS New_PaidOrderIndex
FROM [Order]
WHERE PaymentStatusTypeId in (2,3,6) and SimpleMembershipUserName is not null
) AS UpdateTarget
WHERE UpdateTarget.PaidOrderIndex <> UpdateTarget.New_PaidOrderIndex AND UpdateTarget.PaidOrderIndex IS NOT NULL
-- test to 'break' some of the rows, and then run the UPDATE again
update [order] set PaidOrderIndex = 2 where PaidOrderIndex=3
La parte "NON È NULL" non è richiesta se la colonna non è annullabile.
Quando dico che l'aumento delle prestazioni è stato enorme, intendo che è stato essenzialmente istantaneo durante l'aggiornamento di un piccolo numero di righe. Con gli indici giusti sono stato in grado di ottenere un aggiornamento che ha richiesto la stessa quantità di tempo della query "interna" da sola:
SELECT PaidOrderIndex, SimpleMembershipUserName, ROW_NUMBER() OVER(PARTITION BY SimpleMembershipUserName ORDER BY OrderId) AS New_PaidOrderIndex
FROM [Order]
WHERE PaymentStatusTypeId in (2,3,6) and SimpleMembershipUserName is not null
UPDATE myCol = myCol+1 FROM MyTable WHERE ID=@MyID