Tôi đang chọn một số hàng từ hàm bảng có giá trị nhưng đã tìm thấy sự khác biệt hiệu suất lớn không thể giải thích bằng cách đặt SELECT TOP trong truy vấn.Sự khác biệt hiệu năng lớn của SQL bằng cách sử dụng SELECT TOP x ngay cả khi x cao hơn nhiều hàng đã chọn
SELECT col1, col2, col3 etc
FROM dbo.some_table_function
WHERE col1 = @parameter
--ORDER BY col1
mất tối đa 5 hoặc 6 phút để hoàn thành.
Tuy nhiên
SELECT TOP 6000 col1, col2, col3 etc
FROM dbo.some_table_function
WHERE col1 = @parameter
--ORDER BY col1
hoàn thành trong khoảng 4 hoặc 5 giây.
Điều này sẽ không làm tôi ngạc nhiên nếu tập hợp dữ liệu được trả lại là rất lớn, nhưng truy vấn cụ thể liên quan đến trả về ~ 5000 hàng trong số 200.000.
Vì vậy, trong cả hai trường hợp, toàn bộ bảng được xử lý, khi SQL Server tiếp tục kết thúc để tìm kiếm 6000 hàng mà nó sẽ không bao giờ nhận được. Tại sao sự khác biệt lớn sau đó? Đây có phải là một cái gì đó để làm với cách SQL Server phân bổ không gian với dự đoán kích thước thiết lập kết quả (TOP 6000 do đó cho nó một yêu cầu thấp được phân bổ dễ dàng hơn trong bộ nhớ)? Có ai khác đã chứng kiến một cái gì đó như thế này?
Cảm ơn
Bạn đã xem các kế hoạch truy vấn chưa? Có sự khác biệt nào không? –
Chỉ cần tò mò, điều gì xảy ra với hiệu suất nếu bạn nói SELECT TOP 100 PERCENT ....? –
Tôi đoán bạn có một số thống kê đưa trình tối ưu hóa truy vấn ra khỏi kelter. Trình tối ưu hóa có thể, ví dụ, quyết định sử dụng quét bảng thay vì chỉ mục tìm kiếm nếu nó tin rằng có rất ít hàng trong một bảng. Tại sao điều này không ảnh hưởng đến truy vấn TOP tôi dunno, nhưng kiểm tra các kế hoạch thực hiện. Những điều này cho bạn thấy những gì máy chủ làm, và điều đó sẽ giải thích lý do tại sao một máy chủ chậm. Nó cũng sẽ hiển thị cho bạn số lượng hàng được ước tính và thực tế. Nếu một số ước tính là cách tắt, hãy cập nhật số liệu thống kê và thử lại. :) –