Câu trả lời ngắn: vì tôi ưu nghĩ rằng nó sẽ nhanh hơn.
Tuy nhiên, hãy thử đọc suy nghĩ của trình tối ưu hóa.
Vì bạn chưa cung cấp lược đồ bảng đầy đủ, tôi sẽ giả định rằng có một chỉ số nhóm trên xxx.ID
và rằng #TaxInvoiceData
là một đống. Bạn đang mong đợi một kế hoạch mà chỉ mục PK được thăm dò cho mỗi hàng trong #TaxInvoiceData
, nhưng bạn đang chọn xxx.Field4
sẽ yêu cầu tra cứu dấu trang cho mỗi kết quả phù hợp. Điều này có thể dẫn đến 29.000 yêu cầu I/O ngẫu nhiên. Ouch.
Ngược lại, SQL Server có thể (và rõ ràng sẽ thực hiện) chỉ cần thực hiện một số lượng lớn hơn I/O tuần tự hiệu quả hơn khi quét bảng và có thể thực hiện một kết quả băm nhanh với #TaxInvoiceData
.
Vì vậy, bạn có thể làm gì? Bạn có thể tạo chỉ mục bao gồm Field4
. Hoặc bạn có thể sử dụng chỉ mục và tham gia gợi ý để buộc kế hoạch bạn đang tìm kiếm (nhưng tôi nghi ngờ hiệu suất sẽ không tốt như bạn mong đợi). Truy vấn này có được sử dụng thường xuyên đủ để cung cấp các vấn đề về hiệu suất ứng dụng của bạn hoặc bạn chỉ đang tìm cách loại bỏ quét bảng trên nguyên tắc? Nếu sau này, bạn có thể tìm thấy chi phí của việc loại bỏ việc quét không phải là giá trị nó cuối cùng.
Edit:
Vì bạn đã đề cập rằng không có nhóm chỉ số trên bảng, điều này cũng có thể ảnh hưởng đến cách hiệu quả tra cứu từ các chỉ số đang có. Trừ khi bảng này đang nhìn thấy hoạt động chèn cực kỳ nặng, hãy xem xét việc thay đổi PK của bạn thành nhóm. Điều đó một mình có thể thay đổi kế hoạch, và thậm chí nếu nó không có khả năng tăng tốc độ hoạt động khác do giảm chi phí.
Có bao nhiêu hàng trong #TaxInvoiceData? – Joe
* Chỉ mục tìm kiếm * - ok, nhưng trên ** chỉ mục nào ** ??? Ngoài ra: bạn nói '(ID, Field2, Field3)' là khóa chính trên 'Bảng X' của bạn - đó là chỉ mục ** nhóm ** trên bảng? Hay đây là một đống ?? –
S được tham gia như thế nào? Nó có thể là do khóa chính tôi không phân cụm nó nhanh hơn để quét bảng hơn là nhảy giữa chỉ mục và bảng cho mỗi hàng. – idstam