Tôi gặp sự cố với hiệu suất SQL. Vì lý do đột ngột, các truy vấn sau đây rất chậm:Truy vấn DELETE rất chậm
Tôi có hai danh sách chứa Id của một bảng nhất định. Tôi cần xóa tất cả các bản ghi khỏi danh sách đầu tiên nếu Id đã tồn tại trong danh sách thứ hai:
DECLARE @IdList1 TABLE(Id INT)
DECLARE @IdList2 TABLE(Id INT)
-- Approach 1
DELETE list1
FROM @IdList1 list1
INNER JOIN @IdList2 list2 ON list1.Id = list2.Id
-- Approach 2
DELETE FROM @IdList1
WHERE Id IN (SELECT Id FROM @IdList2)
Có thể có hai danh sách chứa hơn 10.000 hồ sơ. Trong trường hợp đó, cả hai truy vấn đều mất hơn 20 giây để thực thi.
Kế hoạch thực hiện cũng cho thấy điều tôi không hiểu. Có lẽ điều đó giải thích tại sao nó quá chậm:
Tôi điền cả hai danh sách với 10.000 số nguyên tuần tự sao cho cả hai danh sách chứa giá trị 1-10.000 làm điểm bắt đầu.
Như bạn có thể thấy cả hai truy vấn hiển thị cho @ IdList2 Số hàng thực tế là 50.005.000 !!. @ IdList1 là chính xác (Số thực tế của hàng là 10.000)
Tôi biết còn có các giải pháp khác để giải quyết vấn đề này. Giống như điền vào danh sách thứ ba được loại bỏ khỏi danh sách đầu tiên. Nhưng câu hỏi của tôi là:
Tại sao các truy vấn xóa này quá chậm và tại sao tôi lại thấy các kế hoạch truy vấn lạ này?
Đây có phải là một vấn đề có thể gặp phải trong kịch bản thế giới thực hay, chỉ trong tình huống cụ thể này? – Jodrell
@Jodrell - Các vấn đề cơ bản của không có số liệu thống kê dựa trên biên dịch lại cho các biến bảng (và thiếu chỉ số hữu ích trên chúng) là rất phổ biến. –