Bản cập nhật không thành công vì những lý do tương tự như những lý do tôi đã giải thích trong câu trả lời cho câu hỏi trước đó của bạn .
Trong trường hợp này, vì bạn có khả năng cập nhật nhiều hàng trong đó một cột khóa của một chỉ mục duy nhất được thay đổi * , SQL Server xây dựng một kế hoạch bao gồm các toán tử Tách, Sắp xếp và Thu gọn để tránh vi phạm khóa duy nhất trung gian (xem bài viết này để biết chi tiết) .
Do đó, toán tử Sắp xếp đã giới thiệu gặp một hàng trung gian (bao gồm cả các tổng phí bên trong) có chiều rộng vượt quá giới hạn, do đó, một lỗi được đưa ra. Thêm một OPTION (ROBUST PLAN)
gợi ý cho truy vấn cập nhật cho thấy điều này là không thể tránh khỏi:
Msg 8619, Cấp 16, Trạng thái 2, Dòng 681
Bộ xử lý truy vấn không thể tạo kế hoạch truy vấn vì cần có bàn làm việc và kích thước hàng tối thiểu của nó vượt quá mức tối đa cho phép là 8060 byte. Một lý do điển hình tại sao một bàn làm việc được yêu cầu là mệnh đề GROUP BY hoặc ORDER BY trong truy vấn. Gửi lại truy vấn của bạn mà không có gợi ý ROBUST PLAN.
Các mối quan hệ dữ liệu nguồn / đích không rõ ràng với tôi từ một cái nhìn ngắn gọn, nhưng nếu bạn có thể đảm bảo rằng mỗi hoạt động cập nhật sẽ ảnh hưởng đến nhiều nhất một hàng, bạn có thể tránh sự cần thiết của Chia / Sắp xếp / Thu gọn bằng cách thêm TOP (1)
vào câu lệnh cập nhật:
UPDATE TOP (1) [TBL_BM_HSD_SUBJECT_AN_148_REPRO_TARGET]
SET ...
Đây là một chút của một hack, mặc dù. Lý tưởng nhất là việc xây dựng câu lệnh cập nhật và các chỉ mục sẽ cung cấp đủ thông tin cho trình tối ưu hóa để có thể thấy rằng nhiều nhất một hàng sẽ được cập nhật. Cụ thể, cách tốt nhất là viết các báo cáo cập nhật mang tính quyết định .
Với thiết kế kỳ quặc và thiếu rõ ràng trong câu hỏi, tôi thậm chí sẽ không cố gắng giải mã các mối quan hệ dữ liệu, hoặc thay đổi truy vấn & chỉ mục cần thiết để đạt được điều này một cách chi tiết.
* Như Martin Smith đã chỉ ra trong một bình luận, đây sẽ không phải là vấn đề trong tình huống cụ thể này nếu bảng không được phân vùng. Trong đó bản cập nhật đặt khóa thành cùng một giá trị xác định trong mỗi hàng, thì không cần phải phân tách / Sắp xếp / Thu gọn, trừ khi bảng cũng được phân vùng trên khóa đó. Vì vậy, một giải pháp thay thế cho truy vấn này là không phân vùng bảng vào thời gian .