Доверете се на оптимизатора.
Напишете заявката, която най-просто изразява това, което се опитвате да постигнете. Ако имате проблеми с производителността с тази заявка, тогава трябва да погледнете дали има липсващи индекси. Но все пак не трябва да го правите изрично работа с тези индекси.
Не се безпокойте от съображения за това как вие може да приложи такова търсене.
В много в редки случаи може да се наложи допълнително да принудите заявката да използва конкретни индекси (чрез подсказки), но това вероятно е <0,1% от заявките.
Във вашите публикувани планове вашата „оптимизирана“ версия причинява сканиране срещу 2 индекса на вашата (предполагам) таблица с параметри (PK_Params_1, IX_Params_1). Без да виждате заявките, е трудно да разберете защо това се случва, но ако сравнявате едно сканиране срещу таблица („Груба сила“) и две, лесно е да разберете защо второто не е по-ефективно.
Мисля да опитам:
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]
т.е. въведете анти-съединяване, което елиминира резултатите, които не искате.