यह वास्तव में निर्भर करता है, मेरे पास ऐसी स्थितियां थीं जहां मैंने सबक्वायरी का उपयोग करके कुछ प्रश्नों में सुधार किया था।
जिन कारकों से मैं अवगत हूं वे हैं:
- अगर सबक्वेरी तुलना के लिए बाहरी क्वेरी से फ़ील्ड का इस्तेमाल करती है या नहीं (सहसंबंधित या नहीं)
- यदि बाहरी क्वेरी और उप क्वेरी के बीच संबंध अनुक्रमणिका द्वारा कवर किया गया है
- यदि जॉइन पर कोई प्रयोग करने योग्य अनुक्रमणिका नहीं है और सबक्वेरी सहसंबद्ध नहीं है और एक छोटा परिणाम देता है तो इसका उपयोग करना तेज़ हो सकता है
- मैंने उन स्थितियों में भी भाग लिया है जहां एक क्वेरी को एक क्वेरी में बदलना जो ऑर्डर का उपयोग करता है जो इसका उपयोग नहीं करता है और इसे एक साधारण सबक्वायरी और सॉर्ट में बदलने से MySQL में प्रदर्शन में सुधार होता है
वैसे भी, विभिन्न प्रकारों का परीक्षण करना हमेशा अच्छा होता है (SQL_NO_CACHE कृपया के साथ), और सहसंबद्ध प्रश्नों को जुड़ने में बदलना एक अच्छा अभ्यास है।
मैं इसे एक बहुत ही उपयोगी अभ्यास कहने के लिए यहां तक कहूंगा।
यह संभव हो सकता है कि यदि सहसंबद्ध प्रश्न आपके दिमाग में सबसे पहले आते हैं कि आप मुख्य रूप से सेट संचालन के संदर्भ में नहीं सोच रहे हैं, लेकिन मुख्य रूप से प्रक्रियात्मक संचालन के संदर्भ में और संबंधपरक डेटाबेस से निपटने के दौरान सेट को पूरी तरह से अपनाने के लिए बहुत उपयोगी है डेटा मॉडल पर परिप्रेक्ष्य और उस पर परिवर्तन।
संपादित करें:प्रक्रियात्मक बनाम संबंधपरक
सेट ऑपरेशंस बनाम प्रक्रियात्मक उबाल के संदर्भ में कुछ सेट बीजगणित अभिव्यक्तियों में समानता के लिए सोचना, उदाहरण के लिए एक संघ पर चयन चयन के संघ के बराबर है। दोनों में कोई अंतर नहीं है।
लेकिन जब आप दो प्रक्रियाओं की तुलना करते हैं, जैसे कि संघ के प्रत्येक तत्व के लिए चयन मानदंड लागू करना और फिर चयन लागू करना, दोनों अलग-अलग प्रक्रियाएं हैं, जो हो सकती हैं बहुत अलग गुण हैं (उदाहरण के लिए CPU, I/O, मेमोरी का उपयोग)।
रिलेशनल डेटाबेस के पीछे का विचार यह है कि आप यह वर्णन करने की कोशिश नहीं करते हैं कि परिणाम (प्रक्रिया) कैसे प्राप्त करें, लेकिन केवल वही जो आप चाहते हैं, और यह कि डेटाबेस प्रबंधन प्रणाली आपके अनुरोध को पूरा करने के लिए सर्वोत्तम पथ (प्रक्रिया) पर निर्णय लेगी। यही कारण है कि SQL को चौथी पीढ़ी की भाषा (4GL) कहा जाता है ।
एक तरकीब जो आपको ऐसा करने में मदद करती है, वह यह है कि आप अपने आप को याद दिलाएं कि टुपल्स का कोई अंतर्निहित क्रम नहीं है (सेट तत्व अनियंत्रित हैं)। दूसरा यह महसूस कर रहा है कि संबंधपरक बीजगणित काफी व्यापक है और अनुरोधों (आवश्यकताओं) को सीधे SQL में अनुवाद करने की अनुमति देता है (यदि शब्दार्थ का आपका मॉडल समस्या स्थान का अच्छी तरह से प्रतिनिधित्व करता है, या दूसरे शब्दों में यदि अर्थ आपके तालिकाओं और संबंधों के नाम से जुड़ा हुआ है, या दूसरे शब्दों में यदि आपका डेटाबेस अच्छी तरह से डिज़ाइन किया गया है)।
इसलिए, आपको यह सोचने की ज़रूरत नहीं है कि कैसे, केवल क्या।
आपके मामले में, यह केवल सहसंबद्ध प्रश्नों पर वरीयता थी, इसलिए हो सकता है कि मैं आपको कुछ नया नहीं बता रहा हूं, लेकिन आपने उस बिंदु पर जोर दिया, इसलिए टिप्पणी।
मुझे लगता है कि यदि आप प्रश्नों को एक रूप से दूसरे रूप में बदलने वाले सभी नियमों के साथ पूरी तरह से सहज थे (नियम जैसे वितरण) कि आप सहसंबद्ध उपश्रेणियों को पसंद नहीं करेंगे (कि आप सभी रूपों को समान देखेंगे)।
(नोट:ऊपर सैद्धांतिक पृष्ठभूमि पर चर्चा की गई है, जो डेटाबेस डिजाइन के लिए महत्वपूर्ण है; व्यावहारिक रूप से उपरोक्त अवधारणाएं विचलित होती हैं - किसी क्वेरी के सभी समकक्ष पुनर्लेखन आवश्यक रूप से तेजी से निष्पादित नहीं होते हैं, क्लस्टर प्राथमिक कुंजी टेबल को डिस्क पर विरासत क्रम बनाती है, आदि ... लेकिन ये विचलन केवल विचलन हैं; तथ्य यह है कि सभी समकक्ष प्रश्नों को तेजी से निष्पादित नहीं किया जाता है, वास्तविक डीबीएमएस की अपूर्णता है और इसके पीछे की अवधारणा नहीं है)