Esta es una versión modificada de la respuesta de @Aleksandr Fedorenko agregando una 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
Al agregar una cláusula WHERE, encontré que el rendimiento mejoró enormemente para las actualizaciones posteriores. Sql Server parece actualizar la fila incluso si el valor ya existe y lleva tiempo hacerlo, por lo que agregar la cláusula where hace que se salte las filas donde el valor no ha cambiado. Debo decir que me sorprendió lo rápido que podía ejecutar mi consulta.
Descargo de responsabilidad: no soy un experto en DB y estoy usando PARTITION BY para mi cláusula, por lo que puede que no sean exactamente los mismos resultados para esta consulta. Para mí, la columna en cuestión es el pedido pagado de un cliente, por lo que el valor generalmente no cambia una vez que se establece.
También asegúrese de tener índices, especialmente si tiene una cláusula WHERE en la instrucción SELECT. Un índice filtrado funcionó muy bien para mí, ya que filtraba en función de los estados de pago.
Mi consulta usando PARTICIÓN 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
La parte 'IS NOT NULL' no es necesaria si la columna no admite nulos.
Cuando digo que el aumento de rendimiento fue masivo, me refiero a que fue esencialmente instantáneo al actualizar una pequeña cantidad de filas. Con los índices correctos, pude lograr una actualización que tomó la misma cantidad de tiempo que la consulta 'interna' por sí misma:
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