Esta é uma versão modificada da resposta de @Aleksandr Fedorenko adicionando uma cláusula 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
Ao adicionar uma cláusula WHERE, descobri que o desempenho melhorou enormemente para as atualizações subsequentes. O Sql Server parece atualizar a linha, mesmo se o valor já existir e levar tempo para fazer isso, portanto, adicionar a cláusula where faz com que ele simplesmente pule as linhas onde o valor não mudou. Devo dizer que fiquei surpreso com a rapidez com que ele executou minha consulta.
Isenção de responsabilidade: não sou nenhum especialista em DB e estou usando PARTITION BY para minha cláusula, portanto, pode não ser exatamente o mesmo resultado para esta consulta. Para mim, a coluna em questão é um pedido pago do cliente, então o valor geralmente não muda depois de definido.
Além disso, certifique-se de ter índices, especialmente se tiver uma cláusula WHERE na instrução SELECT. Um índice filtrado funcionou muito bem para mim, pois estava filtrando com base nos status de pagamento.
Minha consulta usando PARTITION por
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
A parte 'IS NOT NULL' não é necessária se a coluna não puder ser anulada.
Quando digo que o aumento de desempenho foi enorme, quero dizer que foi essencialmente instantâneo ao atualizar um pequeno número de linhas. Com os índices corretos, consegui obter uma atualização que demorou o mesmo tempo que a consulta "interna" sozinha:
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