2008-09-06 8 views
8

पर विचार करें निम्नलिखित 2 प्रश्न:सबसिलेक्ट बाहरी बनाम में शामिल होने

select tblA.a,tblA.b,tblA.c,tblA.d 
from tblA 
where tblA.a not in (select tblB.a from tblB) 

select tblA.a,tblA.b,tblA.c,tblA.d 
from tblA left outer join tblB 
on tblA.a = tblB.a where tblB.a is null 

कौन सा बेहतर प्रदर्शन करेंगे? मेरी धारणा यह है कि सामान्य रूप से उन मामलों को छोड़कर बेहतर होगा जो उप-चयन एक बहुत छोटा परिणाम सेट देता है।

उत्तर

16

RDBMSs "पुनर्लेखन" प्रश्नों, उन्हें अनुकूलित करने तो यह प्रणाली का उपयोग कर रहे पर निर्भर करता है, और मुझे लगता है कि होगा कि वे सबसे "अच्छा" डेटाबेस पर एक ही कार्य-निष्पादन के अंत।

मैं एक है कि स्पष्ट और बनाए रखने के लिए आसान है चुनने का सुझाव देते, मेरे पैसे के लिए, कि पहले से एक है। सबक्वायरी को डीबग करना बहुत आसान है क्योंकि इसे सैनिटी की जांच के लिए स्वतंत्र रूप से चलाया जा सकता है।

0

मेरे अवलोकनों से, MSSQL सर्वर इन प्रश्नों के लिए एक ही क्वेरी योजना उत्पन्न करता है।

0

मैं MSSQL2005 पर सवाल में एक साधारण से काफी समान क्वेरी बनाया है और समझाने की योजना भिन्न थे। पहली क्वेरी तेज लगती है। मैं एक एसक्यूएल विशेषज्ञ नहीं हूं लेकिन अनुमानित व्याख्या योजना में प्रश्न 1 के लिए प्रश्न 1 और 63% के लिए 37% था। ऐसा लगता है कि क्वेरी 2 के लिए सबसे बड़ी लागत शामिल है। दोनों प्रश्नों में दो टेबल स्कैन थे।

2

मैं टॉम का दूसरा जवाब देता हूं कि आपको समझना और बनाए रखना आसान है।

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

एक सामान्य नियम के मैं उप-चयन का उपयोग करने जब मैं अपने चयन खंड में tblB से किसी भी स्तंभों में शामिल करने की जरूरत नहीं करते हैं के रूप में। मैं निश्चित रूप से एक उप-चयन के लिए जाना चाहूंगा जब मैं 'इन' भविष्यवाणी (और आमतौर पर 'इन' में शामिल नहीं 'के लिए' सामान्य 'उपयोग करना चाहता हूं, सरल कारण यह है कि जब आप या किसी को समझना आसान होता है और वापस आ गया है और उन्हें बदल दिया है।

1

पहली क्वेरी SQL सर्वर में तेज़ी से होगी जो मुझे लगता है कि मामूली काउंटर अंतर्ज्ञानी है - उप प्रश्न प्रतीत होता है जैसे कि उन्हें धीमा होना चाहिए। कुछ मामलों में (जैसे डेटा वॉल्यूम बढ़ता है) existsin से तेज़ हो सकता है।

4

गैर-सहसंबंधित उप प्रश्न ठीक हैं। आपको जिस डेटा को आप चाहते हैं उसका वर्णन करने के साथ जाना चाहिए। जैसा कि उल्लेख किया गया है, यह संभवतः एक ही योजना में फिर से लिखा जाता है, लेकिन इसकी गारंटी नहीं है! और क्या है, यदि टेबल ए और बी 1: 1 नहीं हैं तो आपको जॉइन क्वेरी से डुप्लिकेट टुपल्स मिलेंगे (क्योंकि आईएन क्लॉज एक अंतर्निहित डिस्टिंट सॉर्ट करता है), इसलिए आप जो चाहते हैं उसे कोड करना हमेशा सर्वोत्तम होता है और वास्तव में परिणाम के बारे में सोचता है।

1

यह ध्यान दिया जाना चाहिए कि इन प्रश्नों अलग परिणाम देगा अगर TblB.a अद्वितीय नहीं है।

3

अच्छा, यह डेटासेट पर निर्भर करता है। मेरे अनुभव से, यदि आपके पास छोटा डेटासेट है तो एक बाएं जॉइन के लिए बड़ी संख्या में जाने के लिए जाएं। बड़े डेटासेट पर नहीं है खंड में बहुत धीमी प्रतीत होती है।

एक और चीज जो मैं जोड़ सकता हूं वह यह है कि व्याख्या योजनाएं भ्रामक हो सकती हैं। मैंने कई प्रश्नों को देखा है जहां व्याख्या आकाश उच्च थी और क्वेरी 1 एस के तहत चलती थी। दूसरी तरफ मैंने उत्कृष्ट व्याख्या योजना के साथ प्रश्न देखे हैं और वे घंटों तक दौड़ सकते हैं।

तो सभी आपके डेटा पर परीक्षण करते हैं और स्वयं को देखते हैं।