Dies ist eine modifizierte Version der Antwort von @Aleksandr Fedorenko, in der eine WHERE-Klausel hinzugefügt wird:
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
Durch Hinzufügen einer WHERE-Klausel stellte ich fest, dass sich die Leistung für nachfolgende Updates massiv verbessert hat. SQL Server scheint die Zeile zu aktualisieren, auch wenn der Wert bereits vorhanden ist und dies einige Zeit in Anspruch nimmt. Wenn Sie also die where-Klausel hinzufügen, werden nur Zeilen übersprungen, in denen sich der Wert nicht geändert hat. Ich muss sagen, ich war erstaunt, wie schnell meine Abfrage ausgeführt werden konnte.
Haftungsausschluss: Ich bin kein DB-Experte und verwende PARTITION BY für meine Klausel, sodass bei dieser Abfrage möglicherweise nicht genau die gleichen Ergebnisse erzielt werden. Für mich ist die betreffende Spalte die bezahlte Bestellung eines Kunden, sodass sich der Wert im Allgemeinen nicht ändert, sobald er festgelegt ist.
Stellen Sie außerdem sicher, dass Sie über Indizes verfügen, insbesondere wenn die SELECT-Anweisung eine WHERE-Klausel enthält. Ein gefilterter Index hat für mich hervorragend funktioniert, da ich nach Zahlungsstatus gefiltert habe.
Meine Anfrage mit PARTITION von
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
Der Teil 'IS NOT NULL' ist nicht erforderlich, wenn die Spalte nicht nullwertfähig ist.
Wenn ich sage, dass die Leistungssteigerung massiv war, meine ich, dass sie beim Aktualisieren einer kleinen Anzahl von Zeilen im Wesentlichen sofort erfolgte. Mit den richtigen Indizes konnte ich ein Update erzielen, das genauso lange dauerte wie die 'innere' Abfrage selbst:
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