Si tratta di una versione modificata della risposta di @Aleksandr Fedorenko aggiungere 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
Con l'aggiunta di una clausola dove ho trovato le prestazioni migliorate in maniera massiccia per gli aggiornamenti successivi. Sql Server sembra aggiornare la riga anche se il valore esiste già e ci vuole del tempo per farlo, quindi aggiungere la clausola where lo fa saltare le righe in cui il valore non è cambiato. Devo dire che sono rimasto sbalordito dalla velocità con cui poteva eseguire la mia interrogazione.
Disclaimer: io non sono un esperto di DB, e sto usando PARTITION BY per la mia clausola in modo che non può essere esattamente gli stessi risultati di questa ricerca. Per me la colonna in questione è l'ordine pagato di un cliente, quindi il valore generalmente non cambia una volta impostato.
Inoltre, assicurarsi di avere indici, soprattutto se si dispone di una clausola WHERE sul SELECT. Un indice filtrato ha funzionato perfettamente per me poiché stavo filtrando in base agli stati dei pagamenti.
mio query utilizzando partizione
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
Il 'non è nullo' parte non è necessaria se la colonna non è annullabile.
quando dico l'incremento di prestazioni era enorme intendo dire che era essenzialmente istantanei quando si aggiorna un piccolo numero di righe. Con gli indici di destra sono stato in grado di ottenere un aggiornamento che ha preso la stessa quantità di tempo come la query 'interna' fa da sé:
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
Dati post di esempio e dei risultati attesi, che è il modo migliore per ottenere uno SQL rispondere con Altrimenti tuo? non ha senso e produrrà risposte come questa 'UPDATE myCol = myCol + 1 FROM MyTable WHERE ID = @ MyID' – JonH