Ini adalah versi modifikasi dari jawaban @Aleksandr Fedorenko yang menambahkan klausa WHERE:
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
Dengan menambahkan klausa WHERE saya menemukan kinerja meningkat secara besar-besaran untuk pembaruan selanjutnya. Server Sql tampaknya memperbarui baris tersebut meskipun nilainya sudah ada dan perlu waktu untuk melakukannya, jadi menambahkan klausa where membuatnya hanya melewati baris yang nilainya tidak berubah. Saya harus mengatakan saya heran seberapa cepat bisa menjalankan kueri saya.
Penafian: Saya bukan ahli DB, dan saya menggunakan PARTITION BY untuk klausa saya, jadi mungkin hasilnya tidak sama persis untuk kueri ini. Bagi saya kolom yang dimaksud adalah pesanan berbayar pelanggan, jadi nilainya biasanya tidak berubah setelah ditetapkan.
Juga pastikan Anda memiliki indeks, terutama jika Anda memiliki klausa WHERE pada pernyataan SELECT. Indeks yang difilter bekerja sangat baik untuk saya karena saya memfilter berdasarkan status pembayaran.
Kueri saya menggunakan PARTITION oleh
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
Bagian 'IS NOT NULL' tidak diperlukan jika kolom tidak dapat dinihilkan.
Ketika saya mengatakan peningkatan kinerja sangat besar yang saya maksud itu pada dasarnya instan ketika memperbarui sejumlah kecil baris. Dengan indeks yang tepat, saya dapat mencapai pembaruan yang membutuhkan waktu yang sama seperti kueri 'dalam' dengan sendirinya:
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