Máy chủ SQL, TOP so với ROW_NUMBER


8

Tôi đang tìm hiểu về các kế hoạch Thực hiện và đang thử các truy vấn khác nhau và so sánh hiệu suất của chúng và tình cờ thấy điều này:

SELECT StatisticID
FROM (
    SELECT StatisticID, ROW_NUMBER() OVER (ORDER BY StatisticID) AS rn
    FROM FTCatalog.Statistic
    ) AS T
WHERE T.rn <= 1000
ORDER BY rn

SELECT TOP 1000 StatisticID
FROM FTCatalog.Statistic
ORDER BY StatisticID

Cả hai đều trả về cùng một tập kết quả - tuy nhiên lần đầu tiên thực thi nhanh hơn và ít tài nguyên hơn (ít nhất SSMS cho tôi biết điều đó) Dưới đây là các kế hoạch thực hiện: Kế hoạch thực hiện

So sánh từ SQL Query Plan Explorer: nhập mô tả hình ảnh ở đây Bất cứ ai cũng có thể cho tôi cái nhìn sâu sắc về những gì thực sự xảy ra đằng sau hậu trường và tại sao kết quả lại khác nhau? Nếu có bất cứ điều gì bạn cần - chỉ cần cho tôi biết.

Cảm ơn, Evaldas.


Vì một số lý do, SQL Server không có các truy vấn tốt để viết lại các truy vấn phân trang. Những khác biệt trong kế hoạch và ước tính không nên tồn tại cho một trường hợp phổ biến như vậy.
usr

Câu trả lời:


11

Tôi đoán bạn đang so sánh chi phí ước tính cho các truy vấn. Đó chỉ là ước tính dựa trên (trong số những thứ khác) số lượng hàng ước tính được trả về bởi truy vấn. Không phải số lượng hàng thực tế.

Truy vấn đầu tiên của bạn ước tính rằng nó sẽ trả về 30 hàng và truy vấn thứ hai của bạn ước tính 1000 hàng. Đó là nơi mà sự khác biệt của bạn trong chi phí truy vấn đến từ.

Nếu bạn thay đổi các truy vấn để chỉ tìm nạp 30 hàng, bạn sẽ thấy các hàng ước tính giống nhau cho các truy vấn và truy vấn đầu tiên thực sự có chi phí cao hơn một chút, ít nhất là đối với tôi trong SQL Server 2014.

Không sử dụng các ước tính khi so sánh hiệu suất của các truy vấn. Thay vào đó, hãy sử dụng những thứ như thời lượng, số lần đọc và kích thước của cấp bộ nhớ.


1
Để xác định hiệu suất thực tế, hãy chạy từng truy vấn nhiều lần (GO 10) với tùy chọn Bao gồm thống kê máy khách. Tôi nghi ngờ bạn sẽ thấy thời gian thực hiện thực tế gần hơn so với ước tính chi phí tương đối. Không có phép thuật dưới vỏ bọc; các toán tử kế hoạch truy vấn kể câu chuyện thực tế.
Dan Guzman

Liệu chi phí tương đối (biểu hiện tỷ lệ phần trăm) thực sự có ý nghĩa gì trong SSMS? Điều đó đã làm tôi khó chịu nhất.
Evaldas Buinauskas 19/03/2015

@EvaldasBuinauskas Không chắc chi phí tương đối có hữu ích cho bất cứ điều gì không. Có lẽ đôi khi nhưng tôi không nghĩ rằng có thể có giá trị tất cả sự nhầm lẫn mà nó tạo ra khi mọi người bắt đầu sử dụng tỷ lệ phần trăm ước tính để so sánh hiệu suất của các truy vấn khác nhau. Nó sẽ luôn là một ước tính và ước tính luôn luôn (gần như) sai.
Mikael Eriksson

@EvaldasBuinauskas, những chi phí đó được tập hợp trong quá trình tối ưu hóa và được đưa ra, nhưng không nhằm mục đích trở thành một chỉ số hoặc thời gian chạy thực tế. Các chi phí chỉ là một dự đoán tốt nhất. Xem blog.msdn.com/b/sqlquery Processing / archive / 2006/10/11 / từ
Dan Guzman
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.