นี่คือคำตอบของ @Aleksandr Fedorenko เวอร์ชันแก้ไขโดยเพิ่ม WHERE clause:
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 clause ทำให้เพียงข้ามแถวที่ค่าไม่เปลี่ยนแปลง ฉันต้องบอกว่าฉันประหลาดใจมากว่ามันสามารถเรียกใช้แบบสอบถามของฉันได้เร็วแค่ไหน
คำเตือน: ฉันไม่ใช่ผู้เชี่ยวชาญด้าน DB และฉันใช้ PARTITION BY สำหรับประโยคของฉันดังนั้นผลลัพธ์อาจไม่เหมือนกันทุกประการสำหรับข้อความค้นหานี้ สำหรับฉันคอลัมน์ที่เป็นปัญหาคือคำสั่งซื้อที่ชำระเงินของลูกค้าดังนั้นโดยทั่วไปค่าจะไม่เปลี่ยนแปลงเมื่อตั้งค่าแล้ว
ตรวจสอบให้แน่ใจว่าคุณมีดัชนีโดยเฉพาะอย่างยิ่งถ้าคุณมีคำสั่ง WHERE ในคำสั่ง SELECT ดัชนีที่กรองแล้วทำงานได้ดีสำหรับฉันเนื่องจากฉันกรองตามสถานะการชำระเงิน
คำถามของฉันโดยใช้ 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
ไม่จำเป็นต้องใช้ส่วน '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