オプティマイザーを信頼してください。
達成しようとしていることを最も簡単に表現するクエリを作成します。 もし パフォーマンスに問題がある そのクエリでは、不足しているインデックスがあるかどうかを確認する必要があります。ただし、明示的にする必要はありません。 これらのインデックスを操作してください。
あなたのことを気にしないでください。 そのような検索を実装するかもしれません。
とても まれに、(ヒントを介して) 特定のインデックスを使用するようクエリにさらに強制する必要がある場合がありますが、これはおそらくクエリの 0.1% 未満です。
投稿された計画では、「最適化された」バージョンにより、(おそらく) Params テーブル (PK_Params_1、IX_Params_1) の 2 つのインデックスに対してスキャンが行われています。クエリを見なければ、なぜこれが起こっているのかを知ることは困難ですが、テーブルに対して 1 回のスキャン (「ブルート フォース」) と 2 回のスキャンを比較すると、2 回目のスキャンがより効率的でない理由が簡単にわかります。
試してみたいと思います:
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]
つまり望ましくない結果を排除するアンチ結合を導入します。