Và do đó, bắt đầu trò chơi đáng tiếc là "cố gắng vượt qua trình tối ưu hóa (vì nó không phải lúc nào cũng biết tốt nhất)".
Bạn có thể thử đặt các phần lọc vào một truy vấn con hoặc CTE:
SELECT TOP 30 *
FROM
(SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]) t
ORDER BY sortcode;
Điều này có thể đủ để buộc nó phải lọc trước (nhưng trình tối ưu hóa trở nên "thông minh hơn" với mỗi bản phát hành và đôi khi có thể nhìn thấu những trò tai quái như vậy). Hoặc bạn có thể phải đi xa đến mức đặt mã này vào một UDF . Nếu bạn viết UDF dưới dạng một hàm có giá trị bảng đa câu, với bộ lọc bên trong, sau đó truy vấn UDF đó bằng TOP x
của bạn / ORDER BY
, bạn đã bắt buộc khá tốt thứ tự truy vấn (vì SQL Server hiện không thể tối ưu hóa xung quanh các UDF đa dạng).
Tất nhiên, suy nghĩ về nó, giới thiệu UDF chỉ là một cách để che giấu những gì chúng ta đang thực sự làm - tạo một bảng tạm thời, sử dụng một truy vấn để điền nó (dựa trên bộ lọc WHERE), sau đó truy vấn khác để tìm TOP x
từ bảng tạm thời.