Lita på optimeraren.
Skriv den fråga som enklast uttrycker vad du försöker uppnå. Om du har prestandaproblem med den frågan bör du titta på om det saknas några index. Men du ska fortfarande inte behöva explicit arbeta med dessa index.
Bry dig inte om hur du är kan implementera en sådan sökning.
I mycket sällsynta omständigheter kan du behöva ytterligare tvinga frågan att använda särskilda index (via tips), men detta är förmodligen <0,1 % av frågorna.
I dina publicerade planer orsakar din "optimerade" version skanningar mot 2 index av din (förmodar jag) Params-tabell (PK_Params_1, IX_Params_1). Utan att se frågorna är det svårt att veta varför detta händer, men om du jämför med att ha en enda skanning mot en tabell ("Brute force") och två, är det lätt att se varför den andra inte är mer effektiv.
Jag tror att jag skulle försöka:
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]
d.v.s. introducera en anti-join som eliminerar de resultat du inte vill ha.