これは、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 by を使用した私のクエリ
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