एसक्यूएल जॉइन बनाम प्रदर्शन?


164

मेरे पास एक मामला है जहां एक JOIN या IN का उपयोग करने से मुझे सही परिणाम मिलेंगे ... जिसमें आमतौर पर बेहतर प्रदर्शन होता है और क्यों? यह निर्भर करता है कि आप किस डेटाबेस सर्वर पर चल रहे हैं? (FYI करें मैं MSSQL का उपयोग कर रहा हूं)


:) मैं वास्तव में एक अलग लेख की तलाश कर रहा था जब मैंने कुछ समय पहले इसी तरह का शोध किया था, और गलती से उस पर ठोकर खाई थी
AdaTheDev

संभव
डूप के

जवाबों:


196

आम तौर पर बोलना, INऔर JOINविभिन्न प्रश्न हैं जो अलग-अलग परिणाम दे सकते हैं।

SELECT  a.*
FROM    a
JOIN    b
ON      a.col = b.col

जैसा है वैसा नहीं है

SELECT  a.*
FROM    a
WHERE   col IN
        (
        SELECT  col
        FROM    b
        )

, जब तक b.colअद्वितीय न हो।

हालाँकि, यह पहली क्वेरी का पर्याय है:

SELECT  a.*
FROM    a
JOIN    (
        SELECT  DISTINCT col
        FROM    b
        )
ON      b.col = a.col

यदि ज्वाइनिंग कॉलम ऐसा है UNIQUEऔर इस तरह से चिह्नित किया गया है, तो ये दोनों क्वेरीज़ एक ही प्लान में हैं SQL Server

यदि ऐसा नहीं है, तो INतेजी से है JOINपर DISTINCT

प्रदर्शन विवरण के लिए मेरे ब्लॉग में इस लेख को देखें:


हाँ, यह समझ में आता है कि यदि वे जुड़ने वाले स्तंभ अद्वितीय हैं (जो कि मेरे मामले में है) तो वे इसे अंजाम देंगे
Polaris878

1
एक समान नोट पर, क्या मुझे IN (SELECT DISTINCT ...) या बस IN (SELECT ...) का उपयोग करना चाहिए?
जू

8
@ orlandu63: INतात्पर्य है DISTINCTSQL Serverयह नोटिस करने के लिए पर्याप्त स्मार्ट है, और दोनों प्रश्नों के लिए एक ही योजना उत्पन्न करेगा। यकीन नहीं, हालांकि, अन्य कैसे RDBMSव्यवहार करेंगे।
क्वासोइ

>> IN और JOIN अलग-अलग प्रश्न हैं जो अलग-अलग परिणाम दे सकते हैं। क्या आप यह बता सकते हैं कि इस मामले में अलग-अलग परिणाम क्यों उत्पन्न होंगे, भले ही b.col अद्वितीय न हो?
अभिजीत

explainextended.com/2009/06/16/in-vs-join-vs-exists सच में मेरी मदद करता है .. धन्यवाद ..
अब्बास गलियाकोटवाला

27

मजेदार बात यह है कि, मैंने इस विषय पर एक ब्लॉग पोस्ट किया था।

देखें ओरेकल बनाम MySQL एसक्यूएल सर्वर बनाम: एकत्रीकरण बनाम शामिल

संक्षिप्त उत्तर: आपको इसका परीक्षण करना है और अलग-अलग डेटाबेस बहुत भिन्न होते हैं।


6

यह कहना मुश्किल है - वास्तव में यह पता लगाने के लिए कि कौन सा बेहतर काम करता है, आपको वास्तव में निष्पादन समय की रूपरेखा तैयार करनी होगी।

अंगूठे के एक सामान्य नियम के रूप में, मुझे लगता है कि यदि आपके पास आपके विदेशी कुंजी कॉलम पर सूचकांक हैं, और यदि आप केवल (या अधिकतर) ININ JOIN शर्तों का उपयोग कर रहे हैं, तो JOIN थोड़ा और तेज़ होगा।

लेकिन जैसे ही आप OUTER JOIN का उपयोग करना शुरू करते हैं, या यदि आपके पास विदेशी कुंजी इंडेक्स की कमी है, तो IN जल्दी हो सकता है।

न घुलनेवाली तलछट


मैं यह भी सोच रहा था ... क्योंकि ऐसा लगता है कि JOIN एक अधिक सामान्य मामला है और अधिक अनुकूलित होने की संभावना है
Polaris878

4

तार्किक अंतरों पर एक दिलचस्प राइटअप: SQL सर्वर: JOIN vs IN EXISTS - तार्किक अंतर

मुझे पूरा यकीन है कि यह मानते हुए कि संबंध और अनुक्रमित बनाए रखा जाता है एक जुड़ें बेहतर समग्र प्रदर्शन करेंगे (अधिक प्रयास उस ऑपरेशन के साथ काम करने में चला जाता है: अन्य)। यदि आप इसके बारे में वैचारिक रूप से सोचते हैं तो 2 प्रश्नों और 1 क्वेरी के बीच का अंतर।

आपको इसे क्वेरी एनालाइज़र पर हुक करने की आवश्यकता है और इसे आज़माएं और अंतर देखें। क्वेरी निष्पादन योजना को भी देखें और चरणों को कम करने का प्रयास करें।


4

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

इसलिए यदि आप केवल तालिका के मानों में रुचि रखते हैं, तो आप इस क्वेरी का उपयोग कर सकते हैं:

SELECT  a.*
FROM    a
WHERE   EXISTS (
    SELECT  *
    FROM    b
    WHERE   b.col = a.col
    )

यदि कर्नल को अनुक्रमित नहीं किया जाता है, तो अंतर बहुत बड़ा हो सकता है, क्योंकि डीबी को बी में सभी रिकॉर्ड नहीं ढूंढने पड़ते हैं, जिसका कोल में समान मूल्य है, इसे केवल पहले एक को खोजना होगा। यदि b.col पर कोई इंडेक्स नहीं है और बीए टेबल स्कैन में बहुत सारे रिकॉर्ड परिणाम हो सकते हैं। IN या JOIN के साथ यह एक पूर्ण टेबल स्कैन होगा, EXISTS के साथ यह केवल एक आंशिक टेबल स्कैन होगा (जब तक कि पहला मिलान रिकॉर्ड नहीं मिलता है)।

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

मैंने अक्सर EXISTS को तेजी से पाया है फिर भी यदि कोई इंडेक्स है। यह डेटाबेस सिस्टम (ऑप्टिमाइज़र) पर निर्भर करता है, डेटा और कम से कम उस इंडेक्स के प्रकार पर जिसका उपयोग किया जाता है।


3
MSSql पर जो तथ्य मौजूद है वह IN से बेहतर है जो सच नहीं है। अधिक जानकारी के लिए: explainextended.com/2009/06/16/in-vs-join-vs-exists यहां पर आप पढ़ सकते हैं कि: "कई लोग सोचते हैं कि EXISTS अधिक कुशल है, IN, क्योंकि EXISTS केवल एक पंक्ति देता है। यह है SQL सर्वर के लिए सही नहीं है। जैसा कि हम ऊपर दिए गए उदाहरणों से देख सकते हैं, EXISTS और IN बिल्कुल समान योजनाएँ बनाते हैं। ऐसा इसलिए है क्योंकि EXISTS IN की तुलना में अधिक लचीला है। IN IN को हमेशा EXISTS के रूप में फिर से लिखा जा सकता है। ) लेकिन इसके विपरीत नहीं। "
माइकेल फेलिक्स

3

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

मुझे यकीन नहीं है कि आप MSSQL के किस संस्करण का उपयोग कर रहे हैं, लेकिन आप क्वेरी विश्लेषक में SQL Server 2000 में एक ग्राफिकल प्राप्त कर सकते हैं। मुझे यकीन है कि बाद के संस्करणों में SQL सर्वर स्टूडियो प्रबंधक में यह कार्यक्षमता कुछ गुप्त है।

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


1

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


5
करना चाहिए? शायद। क्या यह? नहीं। मेरी पोस्ट देखें।
क्लेटस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.