Це модифікована версія відповіді @Aleksandr Fedorenko додаючи пункт 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
Додавши пункт WHERE, я виявив, що продуктивність значно покращилася для наступних оновлень. Здається, сервер Sql оновлює рядок, навіть якщо значення вже існує, і для цього потрібен час, тому додавання пункту де дозволяє просто пропустити рядки, де значення не змінилося. Треба сказати, що я був здивований тим, наскільки швидко він може запустити мій запит.
Відмова: Я не експерт по DB, і я використовую PARTITION BY для свого пункту, тому це може бути не однаковим результатом для цього запиту. Для мене стовпець, про який йдеться, - це замовлення, яке надає клієнт, тому значення, як правило, не змінюється, коли воно встановлено.
Також переконайтеся, що у вас є індекси, особливо якщо у оператора SELECT у вас є пункт WHERE. Відфільтрований індекс працював для мене чудово, оскільки я фільтрував на основі статусів платежів.
Мій запит за допомогою PARTITION від
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
Частина "НЕ NULL" не потрібна, якщо стовпець не зводиться до нуля.
Коли я кажу, що підвищення продуктивності було масовим, я маю на увазі, що воно було фактично миттєвим при оновленні невеликої кількості рядків. За допомогою правильних індексів я зміг досягти оновлення, яке зайняло стільки ж часу, як і сам "внутрішній" запит:
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