2010-01-14 14 views
93

मौजूद है मैं उत्सुक जिनमें से नीचे निम्नलिखित अधिक कुशल हो जाएगा हूँ?
मैं हमेशा IN का उपयोग कर, क्योंकि मेरा मानना ​​है कि एसक्यूएल सर्वर परिणाम एक बड़ा IF बयान में सेट बदल जाता है के बारे में थोड़ा सतर्क किया गया है। बड़े परिणाम के लिए सेट के परिणामस्वरूप खराब प्रदर्शन हो सकता है। छोटे परिणामों के सेट के लिए, मुझे यकीन नहीं है कि या तो बेहतर है। बड़े परिणाम सेट के लिए, EXISTS अधिक कुशल नहीं होगा?बनाम में एसक्यूएल सर्वर प्रदर्शन

WHERE EXISTS (SELECT * FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2) 

बनाम

WHERE bx.BoxID IN (SELECT BoxID FROM Base WHERE [Rank = 2]) 
+6

पता लगाने का सबसे अच्छा तरीका यह है कि इसे आजमाएं और कुछ उपाय करें। –

+10

** ** ** ** के लिए एक गैज़िलियन डुप्लिकेट होने के लिए ** प्राप्त हुआ है ...... –

+0

@marc_s: हाँ, लेकिन मुझे लगता है कि यह वास्तव में मामला निर्भर है। मुझे लगता है कि कैनोलिक जवाब klausbyskov है (या जो भी पूर्व कला का दावा कर सकता है)। – RedFilter

उत्तर

117

EXISTS तेजी से हो जाएगा सच।
IN के साथ यह आगे की प्रक्रिया से पहले उप क्वेरी के सभी परिणामों को एकत्रित करेगा।

+3

अच्छे उत्तरों के साथ केवल कुछ ही जगहों पर एक गैज़िलियन डुप्लीकेट जोड़े गए सोच की तरह यह एक अच्छा मुद्दा है। आईएन कथन में एक पूर्ण परिणाम सेट उत्पन्न करने के लिए SQL सर्वर की आवश्यकता होती है, और उसके बाद मुझे लगता है कि एक बड़ा IF कथन बनाते हैं। –

+63

यह सच साबित होता था लेकिन मौजूदा संस्करणों में (कम से कम 2008) ऑप्टिमाइज़र बहुत चालाक है ... यह वास्तव में एक EXISTS() की तरह IN() का व्यवहार करता है। –

+10

@Aaron - हाँ, आम तौर पर ऑप्टिज़र आंतरिक रूप से एक बेहतर योजना का उत्पादन करेगा। हालांकि, आंतरिक शॉर्टकट पर भरोसा करना अधिक जटिल परिदृश्यों में हानिकारक हो सकता है। –

-1

मेरे सिर के ऊपर बंद और नहीं सही होने की गारंटी: मेरा मानना ​​है कि दूसरा तेजी से इस मामले में हो जाएगा।

  1. पहले में, सहसंबद्ध सबक्वेरी कारण होने की संभावना होगी सबक्वेरी प्रत्येक पंक्ति के लिए चलाने के लिए।
  2. दूसरे उदाहरण में, सबक्वेरी केवल एक बार, के बाद से सहसंबद्ध नहीं चलाना चाहिए।
  3. दूसरे उदाहरण में, IN शॉर्ट सर्किट जैसे ही यह एक मैच पाता होगा।
3

मैं, में से अधिक से मौजूद जाना चाहते हैं लिंक नीचे देखें: क्योंकि एक बार इंजन एक हिट मिल गया है, तो क्या यह हालत साबित कर दिया है की तलाश में छोड़ जाएगा

SQL Server: JOIN vs IN vs EXISTS - the logical difference

3

निष्पादन योजना आम तौर पर इन मामलों में समान होने जा रही है, लेकिन जब तक आप देखते हैं कि इंडेक्स आदि के सभी अन्य पहलुओं में अनुकूलक कारक कैसे हैं, तो आप वास्तव में कभी नहीं जानते।

33

मैं एसक्यूएल सर्वर 2005 और 2008 पर कुछ परीक्षण किया है, और मौजूद दोनों पर और में के रूप में अन्य ने कहा है ठीक उसी वास्तविक कार्य योजना लागू के साथ वापस आ,। अनुकूलक इष्टतम है। :)

कुछ है, हालांकि के बारे में पता होना करने के लिए मौजूद है, में, और कभी कभी शामिल हों अलग परिणाम लौट सकते हैं यदि आप नहीं वाक्यांश आपकी क्वेरी सिर्फ सही कार्य करें: http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx

1

EXISTS का अनुकूलन करने के लिए, बहुत शाब्दिक हो; कुछ सिर्फ वहां होना है, लेकिन आपको वास्तव में सहसंबंधित उप-क्वेरी से लौटाए गए किसी भी डेटा की आवश्यकता नहीं है। आप बस एक बूलियन स्थिति का मूल्यांकन कर रहे हैं।

तो:

WHERE EXISTS (SELECT TOP 1 1 FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2)

क्योंकि सहसंबद्ध उप क्वेरी RBAR है, पहला परिणाम हिट हालत सही है, और यह आगे नहीं संसाधित किया जाता है।

+0

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

+2

शीर्ष 1 को बेहतर प्रदर्शन करते हैं (या घटना अनावश्यक) जब EXISTS के साथ प्रयोग किया जाता है। EXISTS हमेशा किसी भी मिलान पंक्ति के रूप में जल्द ही लौटता है। –

+0

मुझे अब तक इस दृष्टिकोण के साथ कोई प्रदर्शन लाभ नहीं मिला। कृपया निष्पादन योजनाओं के कुछ स्क्रीनशॉट दिखाएं – montewhizdoh

28

स्वीकार किए जाते हैं जवाब अदूरदर्शा है और वह में सवाल ढीला थोड़ा:

1) न तो स्पष्ट है कि क्या एक कवर सूचकांक, बाईं में मौजूद है सही का उल्लेख है, या दोनों पक्षों।

2) न तो इनपुट बाएं तरफ सेट के आकार और इनपुट दाहिने तरफ सेट को ध्यान में रखता है।
(प्रश्न सिर्फ एक बड़े बड़े परिणाम सेट का उल्लेख करता है)।

मेरा मानना ​​है कि अनुकूलक बहुत चालाक के बीच परिवर्तित करने के लिए "में" बनाम "मौजूद है" जब वहाँ की वजह से एक महत्वपूर्ण लागत अंतर है (1) और (2), अन्यथा यह सिर्फ एक संकेत के रूप में (इस्तेमाल किया जा सकता उदाहरण के लिए दाईं तरफ एक तलाशने योग्य सूचकांक के उपयोग को प्रोत्साहित करने के लिए मौजूद है)।

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

+2

पता नहीं क्यों इस उत्कृष्ट उत्तर को और अधिक ध्यान नहीं मिला है। दोनों पक्षों के लिए सूचकांक/संरचना को समझना प्रभावित हो सकता है। ख़ूब कहा है। – SheldonH

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