Tin tưởng trình tối ưu hóa.
Viết truy vấn thể hiện đơn giản nhất những gì bạn đang cố gắng đạt được. Nếu bạn đang gặp vấn đề về hiệu suất với truy vấn đó, sau đó bạn nên xem liệu có bất kỳ chỉ mục nào bị thiếu không. Nhưng bạn vẫn không cần phải rõ ràng làm việc với các chỉ mục này.
Đừng quan tâm đến bản thân bởi những cân nhắc về cách bạn có thể triển khai một tìm kiếm như vậy.
Trong rất trong trường hợp hiếm hoi, bạn có thể cần phải buộc truy vấn sử dụng các chỉ mục cụ thể (thông qua gợi ý), nhưng đây có thể là <0,1% các truy vấn.
Trong các kế hoạch đã đăng của bạn, phiên bản "được tối ưu hóa" của bạn đang quét 2 chỉ mục của bảng Tham số (tôi cho là) của bạn (PK_Params_1, IX_Params_1). Nếu không nhìn thấy các truy vấn, rất khó để biết tại sao điều này lại xảy ra, nhưng nếu bạn so sánh với việc quét một bảng duy nhất với một bảng ("Brute force") và hai, thật dễ dàng để hiểu tại sao thứ hai không hiệu quả hơn.
Tôi nghĩ tôi sẽ thử:
SELECT p.ProductID, ptr.[Rank]
FROM dbo.SearchItemsGet(@SearchID, NULL) AS si
JOIN dbo.ProductDefs AS pd
ON pd.ParamTypeID = si.ParamTypeID
JOIN dbo.Params AS p
ON p.ProductDefID = pd.ProductDefID
JOIN dbo.ProductTypesResultsGet(@SearchID) AS ptr
ON ptr.ProductTypeID = pd.ProductTypeID
LEFT JOIN Params p_anti
on p_anti.ProductDefId = pd.ProductDefID and
(p_anti.ParamLo < si.LowMin or p_anti.ParamHi > si.HiMax)
WHERE si.Mode IN (1, 2)
AND p_anti.ProductID is null
GROUP BY p.ProductID, ptr.[Rank]
I E. giới thiệu một chương trình chống tham gia loại bỏ kết quả mà bạn không mong muốn.