TOP (và tại sao) tác động lên kế hoạch thực hiện như thế nào?


35

Đố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 nmệ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 ncông cụ cơ sở dữ liệu sẽ chạy truy vấn bỏ qua TOPmệ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 - TOPlà 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ó TOPmệ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 1001trì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.


Truy vấn có một ORDER BYmệnh đề. Thêm các TOPthay đổ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)
David

1
Thảo luận liên quan: FAST num_rowsgợi ý truy vấn.
Remus Rusanu

Câu trả lời:


39

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 mệnh đề TOP, 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ách thức nói trên khiến tôi nghĩ rằng bạn có thể có một bức tranh tinh thần không chính xác về cách một truy vấn thực hiện. Một toán tử trong kế hoạch truy vấn không phải là một bước (trong đó tập kết quả đầy đủ của bước trước được đánh giá bởi bước tiếp theo.

SQL Server sử dụng mô hình thực thi theo đường ống , trong đó mỗi toán tử hiển thị các phương thức như init () , GetRow ()Close () . Như tên GetRow () gợi ý, một toán tử tạo một hàng tại một thời điểm theo yêu cầu (theo yêu cầu của toán tử mẹ của nó). Điều này được ghi lại trong tài liệu tham khảo Toán tử và vật lý trực tuyến của Sách , với chi tiết hơn trong bài đăng trên blog của tôi Tại sao các kế hoạch truy vấn chạy ngược . Mô hình hàng tại thời điểm này rất cần thiết trong việc hình thành một trực giác âm thanh để thực hiện truy vấn.

Câu hỏi của tôi là, làm thế nào (và tại sao) một TOPmệnh đề n ảnh hưởng đến kế hoạch thực hiện của một truy vấn?

Một số hoạt động logic như TOP, bán tham gia và FAST n gợi ý truy vấn ảnh hưởng đến cách trình tối ưu hóa truy vấn chi phí thay thế kế hoạch thực hiện. Ý tưởng cơ bản là một hình dạng kế hoạch có thể có thể trả về n hàng đầu tiên nhanh hơn một kế hoạch khác được tối ưu hóa để trả về tất cả các hàng.

Ví dụ, tham gia các vòng lặp được lập chỉ mục thường là cách nhanh nhất để trả về một số lượng nhỏ hàng, mặc dù phép băm hoặc hợp nhất với quét có thể hiệu quả hơn trên các tập lớn hơn. Cách trình tối ưu hóa truy vấn lý do về các lựa chọn này là bằng cách đặt Mục tiêu hàng tại một điểm cụ thể trong cây hoạt động logic.

Một mục tiêu hàng sửa đổi cách thay thế kế hoạch truy vấn được tính chi phí. Bản chất của nó là trình tối ưu hóa bắt đầu bằng cách tính chi phí cho mỗi toán tử vì nếu cần phải có bộ kết quả đầy đủ, đặt mục tiêu hàng tại điểm thích hợp và sau đó làm việc trở lại cây kế hoạch ước tính số lượng hàng mà nó cần kiểm tra để đáp ứng mục tiêu hàng.

Ví dụ: logic TOP(10)đặt mục tiêu hàng là 10 tại một điểm cụ thể trong cây truy vấn logic. Chi phí của các nhà khai thác dẫn đến mục tiêu hàng được sửa đổi để ước tính số lượng hàng họ cần sản xuất để đáp ứng mục tiêu hàng. Tính toán này có thể trở nên phức tạp, do đó dễ hiểu hơn tất cả điều này với một ví dụ hoạt động đầy đủ và các kế hoạch thực hiện có chú thích. Các mục tiêu hàng có thể ảnh hưởng nhiều hơn đến việc lựa chọn loại tham gia hoặc liệu tìm kiếm và tra cứu được ưa thích để quét. Thêm chi tiết về điều đó ở đây .

Như mọi khi, một kế hoạch thực hiện được lựa chọn trên cơ sở mục tiêu hàng phải tuân theo khả năng suy luận của trình tối ưu hóa và chất lượng thông tin được cung cấp cho nó. Không phải mọi kế hoạch với mục tiêu hàng sẽ tạo ra số lượng hàng cần thiết nhanh hơn trong thực tế, nhưng theo mô hình chi phí, nó sẽ.

Khi một kế hoạch mục tiêu hàng chứng tỏ không nhanh hơn, thường có các cách để sửa đổi truy vấn hoặc cung cấp thông tin tốt hơn cho trình tối ưu hóa sao cho kế hoạch được chọn tự nhiên là tốt nhất. Lựa chọn nào phù hợp trong trường hợp của bạn phụ thuộc vào chi tiết của khóa học. Tính năng mục tiêu hàng nói chung là rất hiệu quả (mặc dù có một lỗi cần chú ý khi được sử dụng trong các kế hoạch thực hiện song song).

Truy vấn và kế hoạch cụ thể của bạn có thể không phù hợp để phân tích chi tiết tại đây (bằng mọi cách cung cấp kế hoạch thực hiện thực tế nếu bạn muốn) nhưng hy vọng các ý tưởng được nêu ở đây sẽ cho phép bạn tiến bộ.


12

Khi bạn sử dụng TOP, Trình tối ưu hóa sẽ thấy cơ hội thực hiện ít công việc hơn. Nếu bạn yêu cầu 10 hàng, thì rất có thể nó không cần phải tiêu thụ toàn bộ. Vì vậy, toán tử TOP có thể được đẩy xa hơn về phía bên phải. Nó sẽ tiếp tục yêu cầu các hàng từ toán tử tiếp theo (bên phải), cho đến khi nhận đủ.

Bạn chỉ ra rằng không có TOP, truy vấn sẽ sắp xếp dữ liệu ở cuối. Nếu động cơ có thể biết có bao nhiêu hàng sẽ được thỏa mãn trước khi tham gia, thì nó cũng có thể chọn sử dụng một kế hoạch tương tự, định vị TOP ở bên trái. Nhưng với nỗ lực thực hiện Hash Match tương đối cao và có lẽ không có tùy chọn nào cho Hợp nhất Tham gia, Trình tối ưu hóa có thể thích lọc TOP hơn nữa sang phải.

Khi bảng B được truy vấn, nó sẽ tìm nạp một hàng duy nhất tại một thời điểm. Đó là lý do tại sao ước tính là 1. Nó cũng giả định rằng nó sẽ chỉ tìm thấy hàng đó 50% thời gian. Vì vậy, nó đoán nó sẽ cần 2n + 1 tìm kiếm để tìm thấy nó.


Điều đó dường như không đúng khi số lượng hàng ước tính sẽ thay đổi dựa trên cách dữ liệu được tìm nạp. Làm thế nào nó có được dữ liệu không nên ảnh hưởng đến cardinality. Thay đổi trong cách nó tìm nạp thay vào đó sẽ được phản ánh trong số lần thực thi, đúng không?
David

"Số lượng hàng ước tính" là cho mỗi lần thực hiện. Trong một Nested Loop, nó hoàn toàn có khả năng thực thi nhiều lần.
Rob Farley

Đây sẽ là hành vi khác với Số hàng thực tế và số lần thực hiện (thực tế) sau đó. Nếu kế hoạch thực tế hiển thị 16.834 thực thi thực tế và 15.407 hàng thực tế được trả về, tôi lấy điều này có nghĩa là nó đã tìm kiếm 16k nhưng chỉ tìm thấy 15k phù hợp với vị ngữ. Nếu nó có nghĩa là 15k hàng cho mỗi lần thực hiện thì đây sẽ là 15k * 16k = 240 triệu hàng - lớn hơn khoảng 10 lần so với bảng ...
David

Ngoài ra, tôi không chắc chắn tôi làm theo câu cuối cùng của câu trả lời của bạn. Khi bạn nói 2n + 1 tìm cách tìm "nó", ý của bạn là "nó" nghĩa là gì? Chắc chắn không phải là một hàng duy nhất? Bạn có nghĩa là trình tối ưu hóa giả định rằng đối với bất kỳ hàng nào trong A có 50% khả năng nó sẽ được khớp với B và do đó, nó sẽ cần "thử" các hàng 2003 từ A để có được 1001 kết quả khớp từ B? Hành vi này có được ghi lại ở bất cứ đâu bởi Microsoft không? Và nó có liên quan gì đến TOPmệnh đề? Cảm ơn câu trả lời của bạn (s) / kiên nhẫn.
David

Có, Hàng ước tính là cho mỗi lần thực hiện. Hàng thực tế là tổng số. Mặc dù, không có vấn đề gì khi một toán tử trả về nhiều hàng hơn trong bảng, vì rất dễ chứng minh các toán tử trả về cùng một hàng nhiều lần.
Rob Farley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.