2010-07-22 9 views
6
select * 
from ContactInformation c 
where exists (select * from Department d where d.Id = c.DepartmentId) 

select * 
from ContactInformation c 
inner join Department d on c.DepartmentId = d.Id 

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

संपादित करें: -is, वहाँ AlterNet के लिए जिस तरह से जुड़ जाता है तो के रूप में प्रदर्शन को बढ़ाने के लिए: - ऊपर 2 प्रश्नों मैं विभाग से जानकारी के साथ-साथ contactinformation टेबल चाहते हैं

उत्तर

5

आम तौर पर, EXISTS क्लॉज क्योंकि आपको अपेक्षित आउटपुट देने के लिए जॉइन के लिए DISTINCT की आवश्यकता हो सकती है। उदाहरण के लिए, यदि आपके पास ContactInformation पंक्ति के लिए एकाधिक Department पंक्तियां हैं।

ऊपर अपने उदाहरण में, SELECT *:

  • भी अलग उत्पादन का मतलब है तो वे वास्तव में समान नहीं होते हैं
  • एक सूचकांक के कम मौका इस्तेमाल किया जा रहा है क्योंकि आप बाहर
सभी स्तंभों को खींच रहे हैं

यह कहकर कि सीमित कॉलम सूची के साथ भी, वे एक ही योजना देंगे: जब तक आपको DISTINCT की आवश्यकता न हो ... यही कारण है कि मैं कहता हूं "EXISTS"

+0

महान .. मुझे मिला यह। – hrishi

+0

संपादित करें: - इसमें शामिल होने के लिए वैकल्पिक तरीका है, ताकि प्रदर्शन में वृद्धि हो: - उपर्युक्त 2 प्रश्नों में मुझे विभाग से जानकारी के साथ-साथ संपर्क जानकारी तालिका भी चाहिए – hrishi

4

आप को मापने और तुलना करने के लिए की जरूरत है - कोई सुनहरा नियम जो एक बेहतर होगा - यह आपके सिस्टम में बहुत अधिक चर और चीजों पर निर्भर करता है।

SQL सर्वर प्रबंधन स्टूडियो में, आप दोनों प्रश्नों को एक विंडो में डाल सकते हैं, क्वेरी मेनू से Include actual execution plan चुनें, और फिर उन्हें एक साथ चलाएं।

alt text http://i31.tinypic.com/2rw48s2.png

आप दोनों उनके निष्पादन की योजना की तुलना और कैसे काफी समय एक या अन्य प्रश्न पर खर्च किया गया था का एक प्रतिशत मिलना चाहिए। सबसे अधिक संभावना है कि, इस मामले में दोनों 50% के करीब होंगे। यदि नहीं - तो आप जानते हैं कि कौन से दो प्रश्न बेहतर प्रदर्शन करते हैं।

आप Simple-Talk से SQL सर्वर निष्पादन योजनाओं (और यहां तक ​​कि एक निःशुल्क ई-पुस्तक डाउनलोड भी) के बारे में अधिक जान सकते हैं - अत्यधिक अनुशंसित।

1

आपकी पहली क्वेरी विभाग कॉलम आउटपुट करनी चाहिए, जबकि दूसरे को नहीं करना चाहिए।

यदि आप केवल संपर्क जानकारी में रुचि रखते हैं, तो ये प्रश्न समकक्ष हैं। आप दोनों को चला सकते हैं और क्वेरी निष्पादन योजना की जांच कर सकते हैं यह देखने के लिए कि कौन सा तेजी से चलता है। उदाहरण के लिए, MYSQL पर, where exists शून्य कॉलम के साथ अधिक कुशल है, जबकि inner join बेहतर प्रदर्शन करता है यदि न तो कॉलम शून्य हो।

2

मुझे लगता है कि या तो आप DISTINCT कीवर्ड को अपनी दूसरी क्वेरी में SELECT खंड में जोड़ना चाहते थे (या कम संभावना है, विभाग में केवल एक संपर्क है)।

सबसे पहले, हमेशा 'तार्किक' विचारों से शुरू करें। EXISTS निर्माण तर्कसंगत रूप से अधिक सहज है, इसलिए सभी चीजें 'भौतिक' बराबर होती हैं, मैं इसके साथ जाऊंगा।

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

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

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