2011-01-25 17 views
26

मैं कुछ खराब लिखित एसक्यूएल प्रश्नों को फिर से लिखने पर काम कर रहा हूं और वे उप-प्रश्नों का अधिक उपयोग कर रहे हैं। मैं उप-प्रश्नों के उपयोग के संबंध में सर्वोत्तम प्रथाओं की तलाश में हूं।एसक्यूएल उप-प्रश्नों का प्रयोग मानक मानक में बनाते समय?

किसी भी मदद की सराहना की जाएगी।

+0

ऐसा नहीं है कि चांदी की गोली नहीं है - मुद्दा यह है कि प्रश्न का उत्तर व्यापक रूप से उत्तर दिया जाना चाहिए।इस बात की कोई गारंटी नहीं है कि एक डेटाबेस (MySQL) पर क्या काम करता है, ठीक उसी पर काम करता है। सबसे सरल नियम यह है कि अगर उपधारा से कॉलम अंतिम परिणाम सेट में हैं, तो जॉइन का उपयोग करें - यह दो तालिकाओं से डेटा प्राप्त करने का सबसे इष्टतम माध्यम है। अन्यथा, एक सबक्वायरी ठीक है लेकिन सहसंबंधित समस्याएं पैदा कर सकती हैं (हालांकि EXISTS के साथ नहीं)। –

+1

आप किस आधार पर बताते हैं कि उप-प्रश्नों का उपयोग खत्म हो रहा है? यह निर्णय लेने में अजीब लगता है कि _ और फिर उप-प्रश्नों का उपयोग करने के लिए सर्वोत्तम प्रथाओं के बारे में जानकारी मांगें। –

+1

[बनाम उप-क्वेरी में शामिल हों] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/2577174/join-vs-sub-query) –

उत्तर

39

सबक्वायरी आमतौर पर तब तक ठीक होते हैं जब तक वे निर्भर उपक्वियर (जिसे correlated subqueries भी कहा जाता है)। यदि आप केवल स्वतंत्र सबक्वायरीज़ का उपयोग कर रहे हैं और वे उपयुक्त इंडेक्स का उपयोग कर रहे हैं तो उन्हें जल्दी से चलना चाहिए। यदि आपके पास एक निर्भर सबक्वायरी है तो आप प्रदर्शन समस्याओं में भाग ले सकते हैं क्योंकि बाहरी क्वेरी में प्रत्येक पंक्ति के लिए आम तौर पर एक निर्भर सबक्वायरी को चलाने की आवश्यकता होती है। तो यदि आपकी बाहरी क्वेरी में 1000 पंक्तियां हैं, तो सबक्वायरी 1000 बार चल जाएगी। दूसरी तरफ एक स्वतंत्र सबक्वायरी को आम तौर पर केवल एक बार मूल्यांकन करने की आवश्यकता होती है।

यदि आप सुनिश्चित नहीं हैं कि सबक्वायरी आश्रित या स्वतंत्र होने का मतलब अंगूठे का नियम है - यदि आप सबक्वायरी ले सकते हैं, इसे अपने संदर्भ से हटा दें, इसे चलाएं, और परिणाम सेट करें तो यह एक है independent subquery

यदि आपको वाक्यविन्यास त्रुटि मिलती है क्योंकि यह सबक्वायरी के बाहर कुछ तालिकाओं को संदर्भित करता है तो यह dependent subquery है।

पाठ्यक्रम के सामान्य नियम में कुछ अपवाद हैं। उदाहरण के लिए:

  • कई अनुकूलक एक निर्भर सबक्वायरी ले सकते हैं और इसे जॉइन के रूप में कुशलतापूर्वक चलाने के लिए एक रास्ता खोज सकते हैं। उदाहरण के लिए, कोई EXISTS क्वेरी के परिणामस्वरूप एंटी जॉइन क्वेरी प्लान नहीं हो सकता है, इसलिए यह जॉइन के साथ क्वेरी लिखने की तुलना में धीमा नहीं होगा।
  • MySQL में bug है जहां एक अभिव्यक्ति के अंदर एक स्वतंत्र सबक्वायरी गलत आश्रित के रूप में गलत रूप से पहचाना जाता है और इसलिए एक उप-विषय क्वेरी योजना का उपयोग किया जाता है। यह स्पष्ट रूप से MySQL के नवीनतम संस्करणों में तय किया गया है।

यदि प्रदर्शन एक मुद्दा है तो अपने विशिष्ट प्रश्नों को मापें और देखें कि आपके लिए सबसे अच्छा क्या काम करता है।

+0

सहसंबंधित से क्या आप बाहरी क्वेरी में कॉलम का संदर्भ रखते हैं? –

+0

@El Ronnoco: Yes –

+3

"कई अनुकूलक एक निर्भर सबक्वायरी ले सकते हैं और इसे कुशलतापूर्वक चलाने के लिए एक रास्ता खोज सकते हैं" - मैं इस कथन से सहमत हूं, और यह आपके पूरे तर्क को अस्वीकार करता है यानी "सहसंबंधित सबक्वायरी खराब हैं जब वे खराब नहीं हैं" । – onedaywhen

4

दुर्भाग्यवश उत्तर आपके द्वारा उपयोग किए जा रहे SQL सर्वर पर निर्भर करता है। सिद्धांत रूप में, एक शुद्ध-संबंध-सिद्धांत बिंदु दृष्टिकोण से जुड़ना बेहतर होता है। उन्होंने सर्वर को हुड के नीचे सही काम करने दिया और उन्हें अधिक नियंत्रण दिया और अंत में अंत में तेज़ हो सकता है। यदि सर्वर को अच्छी तरह से लागू किया गया है। प्रैक्टिस में, कुछ एसक्यूएल सर्वर बेहतर प्रदर्शन करते हैं यदि आप उप-प्रश्नों और इसी तरह के माध्यम से अपने प्रश्नों को अनुकूलित करने में इसे चालित करते हैं।

+0

कुछ उप-प्रश्नों को भी शामिल करने के लिए प्रोत्साहित किया जा सकता है (सर्वर-निर्भर, पाठ्यक्रम)। ज्यादातर मामलों में मुझे लगता है कि "मेरे सिर फिट" बेहतर हो जाता है। –

+0

नहीं, यदि कोई सर्वर अच्छी तरह कार्यान्वित किया गया है तो यह जॉइन या उप-क्वेरी करने के लिए सबसे तेज़ तरीका पहचान लेगा और इष्टतम निष्पादन योजना का उत्पादन करेगा। यदि जॉइन और उप-क्वेरी बीजगणितीय रूप से समान हैं, तो एक अच्छी तरह से लागू सर्वर एक ही निष्पादन योजना का उत्पादन करेगा। –

+0

हाँ ... सब सच है। यदि कोई सर्वर पूरी तरह कार्यान्वित किया जाता है तो यह हमेशा आपके टूटे हुए प्रश्नों को भी अनुकूलित करेगा ;-) लेकिन ... यह मेरा अधिकांश बिंदु था: यदि आप अपने व्यवहारों के अनुसार व्यवहार करते हैं तो लगभग सभी एसक्यूएल सर्वर बेहतर होते हैं। यह एक दुर्भाग्यपूर्ण सत्य है। आम तौर पर, अब तक एक उत्पाद बेहतर काम करने की संभावना अधिक है, इससे कोई फर्क नहीं पड़ता कि आप अपने प्रश्नों को कैसे बनाते हैं। लेकिन यह भी हमेशा सच नहीं है। –

5

यहां कोई चांदी की बुलेट नहीं है। प्रत्येक उपयोग को स्वतंत्र रूप से मूल्यांकन किया जाना चाहिए। वहाँ, यह एक नीचे बेहतर एक के रूप में लिखा गया है शामिल हों

select nickname, (select top 1 votedate from votes where user_id=u.id order by 1 desc) 
from users u 

दूसरी ओर, कुछ मामलों में जहां सहसंबद्ध सबक्वेरी सादा अक्षम हैं कर रहे हैं मौजूद है और मौजूद नहीं है प्रश्नों बाहर जीतेंगे मिलती से अधिक।

select ... 
where NOT EXISTS (.....) 

तेजी से

select ... 
FROM A LEFT JOIN B 
where B.ID is null 

अभी तक इन सामान्यीकरण किसी विशेष स्कीमा और डेटा वितरण के लिए झूठ हो सकता है आम तौर पर है।

+3

... और आरडीबीएमएस :-) –

संबंधित मुद्दे