यह एक आरडीबीएमएस-अज्ञेयवादी उत्तर है, लेकिन फिर भी मदद कर सकता है। मेरी समझ में, सहसंबंधित (उर्फ, आश्रित) सबक्वेरी खराब प्रदर्शन के लिए शायद सबसे अधिक झूठा आरोपित अपराधी है।
समस्या (जैसा कि इसे अक्सर वर्णित किया जाता है) यह है कि यह बाहरी क्वेरी की प्रत्येक पंक्ति के लिए आंतरिक क्वेरी को संसाधित करती है। इसलिए, यदि बाहरी क्वेरी 1,000 पंक्तियाँ लौटाती है, और आंतरिक क्वेरी 10,000 लौटाती है, तो परिणाम उत्पन्न करने के लिए आपकी क्वेरी को 10,000,000 पंक्तियों (बाहरी × आंतरिक) से गुजरना होगा। एक ही परिणाम सेट पर एक गैर-सहसंबद्ध क्वेरी से 11,000 पंक्तियों (बाहरी+आंतरिक) की तुलना में, यह अच्छा नहीं है।
हालाँकि, यह सिर्फ सबसे खराब स्थिति है। कई मामलों में, डीबीएमएस पंक्तियों की संख्या को काफी कम करने के लिए इंडेक्स का फायदा उठाने में सक्षम होगा। यहां तक कि अगर केवल आंतरिक क्वेरी एक इंडेक्स का उपयोग कर सकती है, तो 10,000 पंक्तियाँ ~13 सीक्स बन जाती हैं, जो कुल 13,000 तक गिर जाती है।
exists
ऑपरेटर पहले के बाद पंक्तियों को संसाधित करना बंद कर सकता है, क्वेरी लागत को और कम कर सकता है, खासकर जब अधिकांश बाहरी पंक्तियाँ कम से कम एक आंतरिक पंक्ति से मेल खाती हैं।
कुछ दुर्लभ मामलों में, मैंने देखा है कि SQL Server 2008R2 सहसंबद्ध उपश्रेणियों को मर्ज जॉइन में ऑप्टिमाइज़ करता है (जो दोनों सेटों को केवल एक बार पार करता है - सर्वोत्तम संभव परिदृश्य) जहां आंतरिक और बाहरी दोनों प्रश्नों में एक उपयुक्त अनुक्रमणिका मिल सकती है।
खराब प्रदर्शन के लिए असली अपराधी जरूरी नहीं है सहसंबंधित उपश्रेणियां , लेकिन नेस्टेड स्कैन ।