Đây là phiên bản sửa đổi của câu trả lời của @Aleksandr Fedorenko thêm điều khoản 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
Bằng cách thêm mệnh đề WHERE, tôi thấy hiệu suất được cải thiện hàng loạt cho các bản cập nhật tiếp theo. Sql Server dường như cập nhật hàng ngay cả khi giá trị đã tồn tại và cần thời gian để làm như vậy, vì vậy việc thêm mệnh đề where làm cho nó chỉ bỏ qua các hàng mà giá trị không thay đổi. Tôi phải nói rằng tôi đã rất ngạc nhiên vì nó có thể chạy truy vấn của tôi nhanh như thế nào.
Tuyên bố từ chối trách nhiệm: Tôi không phải là chuyên gia DB và tôi đang sử dụng PARTITION BY cho mệnh đề của mình nên nó có thể không giống kết quả chính xác cho truy vấn này. Đối với tôi, cột được đề cập là đơn đặt hàng đã trả tiền của khách hàng, vì vậy, giá trị thường không thay đổi khi nó được đặt.
Ngoài ra, hãy đảm bảo rằng bạn có các chỉ mục, đặc biệt nếu bạn có mệnh đề WHERE trong câu lệnh SELECT. Chỉ mục được lọc rất hiệu quả đối với tôi vì tôi đang lọc dựa trên trạng thái thanh toán.
Truy vấn của tôi bằng PARTITION bởi
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
Không bắt buộc phải có phần 'IS NOT NULL' nếu cột này không thể rỗng.
Khi tôi nói sự gia tăng hiệu suất là rất lớn, tôi có nghĩa là nó về cơ bản là tức thời khi cập nhật một số lượng nhỏ hàng. Với các chỉ mục phù hợp, tôi đã có thể đạt được bản cập nhật mất cùng một khoảng thời gian như truy vấn 'bên trong' của chính nó:
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