이것은 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
UPDATE myCol = myCol+1 FROM MyTable WHERE ID=@MyID