truy vấn đầu tiên thực hiện quét bảng dựa trên ngưỡng tôi đã giải thích trước đó: Có thể tăng hiệu suất truy vấn trên một bảng hẹp với hàng triệu hàng không?
(rất có thể truy vấn của bạn không có TOP 1000
mệnh đề sẽ trả về hơn 46k hàng hoặc một số trong khoảng từ 35k đến 46k. (vùng màu xám ;-))
truy vấn thứ hai, phải được đặt hàng. Vì chỉ mục NC của bạn được sắp xếp theo thứ tự bạn muốn, nên trình tối ưu hóa sẽ sử dụng chỉ mục đó rẻ hơn, sau đó đến phần tra cứu dấu trang đến chỉ mục được nhóm để lấy các cột bị thiếu khi thực hiện quét chỉ mục cụm và sau đó cần quét để đặt hàng đó.
đảo ngược thứ tự của các cột trong ORDER BY
mệnh đề và bạn quay lại quét chỉ mục theo cụm vì NC INDEX sau đó vô dụng.
chỉnh sửa quên câu trả lời cho câu hỏi thứ hai của bạn, tại sao bạn KHÔNG muốn điều này
Sử dụng một chỉ mục không bao gồm cụm không có nghĩa là một hàngID được tra cứu trong chỉ mục NC và sau đó các cột bị thiếu phải được tra cứu trong chỉ mục được phân cụm (chỉ mục được nhóm chứa tất cả các cột của bảng). IO để tra cứu các cột bị thiếu trong chỉ mục được nhóm là IO ngẫu nhiên.
Chìa khóa ở đây là RANDOM. bởi vì đối với mỗi hàng được tìm thấy trong chỉ mục NC, các phương thức truy cập phải tìm kiếm một trang mới trong chỉ mục được nhóm. Điều này là ngẫu nhiên, và do đó rất tốn kém.
Bây giờ, mặt khác, trình tối ưu hóa cũng có thể thực hiện quét chỉ mục cụm. Nó có thể sử dụng bản đồ phân bổ để tra cứu phạm vi quét và chỉ cần bắt đầu đọc chỉ mục Clustered trong các khối lớn. Đây là tuần tự và rẻ hơn nhiều. (miễn là bảng của bạn không bị phân mảnh :-)) Nhược điểm là, chỉ số cụm WHOLE cần được đọc. Điều này không tốt cho bộ đệm của bạn và có khả năng là một số lượng lớn IOs. nhưng vẫn còn, các IO liên tiếp.
Trong trường hợp của bạn, trình tối ưu hóa quyết định ở đâu đó giữa các hàng 35k và 46k, sẽ ít tốn kém hơn khi quét chỉ mục toàn cụm. Vâng, đó là sai. Và trong rất nhiều trường hợp với các chỉ mục không được thu hẹp mà không chọn WHERE
các mệnh đề hoặc bảng lớn cho vấn đề này, điều này đã sai. (Bảng của bạn tệ hơn, vì đó cũng là một bảng rất hẹp.)
Bây giờ, việc thêm ORDER BY
làm cho tốn kém hơn để quét chỉ mục cụm đầy đủ và sau đó đặt hàng kết quả. Thay vào đó, trình tối ưu hóa giả định sẽ rẻ hơn khi sử dụng chỉ số NC đã đặt hàng và sau đó trả tiền phạt IO ngẫu nhiên cho việc tra cứu dấu trang.
Vì vậy, đơn đặt hàng của bạn là một loại giải pháp "gợi ý truy vấn" hoàn hảo. NHƯNG, tại một thời điểm nhất định, một khi kết quả truy vấn của bạn quá lớn, hình phạt cho các IO ngẫu nhiên tra cứu dấu trang sẽ rất lớn nên nó trở nên chậm hơn. Tôi giả sử trình tối ưu hóa sẽ thay đổi kế hoạch trở lại quét chỉ mục cụm trước thời điểm đó nhưng bạn không bao giờ biết chắc chắn.
Trong trường hợp của bạn, miễn là các phần chèn của bạn được sắp xếp theo enterdate, như được thảo luận trong trò chuyện và câu hỏi trước đó (xem liên kết), bạn nên tạo chỉ mục được nhóm trên cột enterDate.