Bu, @Aleksandr Fedorenko'nun yanıtının bir WHERE cümlesi ekleyen değiştirilmiş bir versiyonudur:
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
Bir WHERE yan tümcesi ekleyerek, sonraki güncellemeler için performansın büyük ölçüde arttığını gördüm. Sql Server, değer zaten mevcut olsa bile satırı güncelliyor gibi görünüyor ve bunu yapmak zaman alıyor, bu nedenle where cümlesini eklemek, değerin değişmediği satırları atlamasını sağlar. Sorgumu ne kadar hızlı çalıştırdığına şaşırdığımı söylemeliyim.
Sorumluluk reddi: Ben DB uzmanı değilim ve yan tümcem için PARTITION BY kullanıyorum, bu nedenle bu sorgu için tam olarak aynı sonuçlar olmayabilir. Benim için söz konusu sütun bir müşterinin ödenmiş siparişidir, bu nedenle değer genellikle ayarlandıktan sonra değişmez.
Ayrıca, özellikle SELECT deyiminde bir WHERE yan tümceniz varsa, dizinlere sahip olduğunuzdan emin olun. Ödeme durumlarına göre filtre uygularken filtrelenmiş bir dizin benim için harika çalıştı.
PARTITION kullanarak sorgum
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
Sütun boş değer atanabilir değilse 'IS NOT NULL' bölümü gerekli değildir.
Performans artışının çok büyük olduğunu söylediğimde, az sayıda satırı güncellerken esasen anlık olduğunu kastediyorum. Doğru dizinler ile, 'iç' sorgunun kendi başına yaptığı gibi aynı süreyi alan bir güncelleme elde edebildim:
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