これは、WHERE句を追加した@Aleksandr Fedorenkoの回答の修正版です。
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 Serverは、値がすでに存在している場合でも行を更新するようであり、更新に時間がかかるため、where句を追加すると、値が変更されていない行がスキップされます。クエリの実行速度に驚かされたと言わざるを得ません。
免責事項:私は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可能でない場合、「IS NOT 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