Đối với một truy vấn phức tạp vừa phải mà tôi đang cố gắng tối ưu hóa, tôi nhận thấy rằng việc loại bỏ TOP n
mệnh đề sẽ thay đổi kế hoạch thực hiện. Tôi đã đoán rằng khi một truy vấn bao gồm TOP n
công cụ cơ sở dữ liệu sẽ chạy truy vấn bỏ qua TOP
mệnh đề, và cuối cùng, chỉ thu nhỏ kết quả đó được đặt xuống n số hàng được yêu cầu. Kế hoạch thực hiện đồ họa dường như chỉ ra đây là trường hợp - TOP
là bước "cuối cùng". Nhưng nó xuất hiện có nhiều hơn đang diễn ra.
Câu hỏi của tôi là, làm thế nào (và tại sao) một mệnh đề TOP n ảnh hưởng đến kế hoạch thực hiện của một truy vấn?
Đây là phiên bản đơn giản hóa những gì đang diễn ra trong trường hợp của tôi:
Truy vấn khớp các hàng từ hai bảng, A và B.
Không có TOP
mệnh đề, trình tối ưu hóa ước tính sẽ có 19k hàng từ bảng A và 46k hàng từ bảng B. Số hàng thực tế được trả về là 16k cho A và 13k cho B. Một kết quả băm được sử dụng để tham gia hai tập kết quả này cho a tổng cộng 69 hàng (sau đó một loại được áp dụng). Truy vấn này xảy ra rất nhanh.
Khi tôi thêm TOP 1001
trình tối ưu hóa không sử dụng kết hợp băm; thay vào đó, trước tiên, nó sắp xếp các kết quả từ bảng A (cùng ước tính / thực tế là 19k / 16k) và thực hiện một vòng lặp lồng vào bảng B. Số lượng hàng ước tính cho bảng B hiện là 1 và điều kỳ lạ là TOP n
ảnh hưởng trực tiếp đến ước tính số lần thực hiện (tìm kiếm chỉ mục) so với B - dường như luôn luôn là 2n + 1 hoặc trong trường hợp của tôi 2003. Ước tính này thay đổi tương ứng nếu tôi thay đổi TOP n
. Tất nhiên, vì đây là một phép nối lồng nhau nên số lần thực hiện thực tế là 16k (số lượng hàng từ bảng A) và điều này làm chậm truy vấn.
Kịch bản thực tế phức tạp hơn một chút nhưng điều này nắm bắt ý tưởng / hành vi cơ bản. Cả hai bảng được tìm kiếm bằng cách tìm kiếm chỉ mục. Đây là phiên bản SQL Server 2008 R2 Enterprise.
FAST num_rows
gợi ý truy vấn.
ORDER BY
mệnh đề. Thêm cácTOP
thay đổi trong kế hoạch loại này xảy ra, nhưng tôi quan tâm hơn về cách nó ảnh hưởng đến số lần thực hiện của chỉ số tìm kiếm so với bảng B ... (tất nhiên cả hai có thể liên quan - tôi không biết)