अनुकूलक पर भरोसा करें।
वह प्रश्न लिखें जो सबसे सरलता से व्यक्त करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं। अगर आप प्रदर्शन कर रहे हैं समस्याएं उस क्वेरी के साथ, तो आपको यह देखना चाहिए कि क्या कोई अनुक्रमणिका गुम है या नहीं। लेकिन आपको अभी भी स्पष्ट रूप से . नहीं करना चाहिए इन इंडेक्स के साथ काम करें।
आप कैसे आप . के बारे में सोचकर अपने आप को चिंतित न करें ऐसी खोज को लागू कर सकता है।
बहुत . में दुर्लभ परिस्थितियों में, आपको विशेष अनुक्रमणिका (संकेतों के माध्यम से) का उपयोग करने के लिए क्वेरी को और अधिक बाध्य करने की आवश्यकता हो सकती है, लेकिन यह संभवतः <0.1% क्वेरी है।
आपकी पोस्ट की गई योजनाओं में, आपका "अनुकूलित" संस्करण आपके (मुझे लगता है) Params तालिका (PK_Params_1, IX_Params_1) के 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]
अर्थात। एक एंटी-जॉइन पेश करें जो उन परिणामों को समाप्त कर देता है जो आप नहीं चाहते हैं।