2010-03-22 10 views
6

मुझे ऑर्डर के साथ सभी घरों को देखने की ज़रूरत है। मुझे ऑर्डर के डेटा की परवाह नहीं है, बस यह मौजूद है। (SQL सर्वर का उपयोग करना)क्या दूसरी तालिका से डेटा की आवश्यकता नहीं होने पर EXISTS की तुलना में अधिक/कम कुशल है?

यह और अधिक कुशल कुछ इस तरह कहने के लिए है:

SELECT HouseholdID, LastName, FirstName, Phone 
FROM Households 
INNER JOIN Orders ON Orders.HouseholdID = Households.HouseholdID 

या इस:

SELECT HouseholdID, LastName, FirstName, Phone 
FROM Households 
WHERE EXISTS 
    (SELECT HouseholdID 
    FROM Orders 
    WHERE Orders.HouseholdID = Households.HouseholdID) 
+0

क्या DB (Oracle, SQL सर्वर, MySQL, SQLite :-) आप उपयोग कर रहे:

यह लेख देखें? – lexu

+0

ओह! जानकारी शामिल करने के लिए संपादित प्रश्न - SQL सर्वर – twpc

उत्तर

3

2 प्रश्न बराबर नहीं हैं। यदि एकाधिक शामिल होने वाले रिकॉर्ड हैं तो पहला व्यक्ति कई परिणाम देगा। EXISTS अधिक कुशल होंगे हालांकि विशेष रूप से यदि कोई विश्वसनीय एफके बाधा नहीं है जो ऑप्टिमाइज़र उपयोग कर सकता है।

इस अंतिम बिंदु पर अधिक जानकारी के लिए यहां http://www.simple-talk.com/sql/t-sql-programming/13-things-you-should-know-about-statistics-and-the-query-optimizer/

+0

लिंक किया गया आलेख SQL सर्वर के लिए है, यह सभी डेटाबेस पर लागू नहीं होता है। जैसा कि मैंने अपने उत्तर में कहा है यह आपके डेटाबेस पर निर्भर करता है, लेकिन SQL सर्वर शामिल होने से बेहतर EXISTS को अनुकूलित करेगा। –

2

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

0

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

4

बिंदु 9 देखें जब तक यह एक काफी कठोर 1: 1 संबंध (जो एक घरों और आदेश के व्यापक अर्थ दिया खास मतलब नहीं लगता है) , आपके प्रश्न अलग-अलग परिणाम लौटाएंगे (यदि ऑर्डर तालिका में अधिक मिलान पंक्तियां हैं)।

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

डीबीएमएस के बावजूद मैं समझाऊंगा कि योजना को अंतर दिखाने की योजना होगी (यदि टेबल काफी बड़े हैं तो क्वेरी पूर्ण तालिका स्कैन द्वारा हल नहीं की जाएगी)।

क्या आपने इसका परीक्षण करने की कोशिश की है? कैशिंग के लिए अनुमति?

सी

0

postgres में, मौजूद है तेजी से आंतरिक में शामिल होने से होगा।

1

जैसा कि पहले कहा गया था, कम से कम एक घर में एक से अधिक आदेश होने पर आपके प्रश्न अलग-अलग परिणाम लौटाएंगे।

आप DISTINCT का उपयोग करके इसके आसपास काम कर सकते हैं, लेकिन EXISTS (या IN) अधिक कुशल है।

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