2012-05-21 17 views
5

मेरे पास मेरी क्वेरी में 4 पूर्ण-बाहरी शामिल हैं और यह वास्तव में धीमा है, तो क्या FULL OUTER JOIN का क्रम प्रदर्शन/परिणाम में अंतर बनाता है?एसक्यूएल सर्वर: पूर्ण बाहरी मामले में आदेश का आदेश है?

पूर्ण बाहरी शामिल हों = ⋈

फिर

,

मैं एक स्थिति है: एक ⋈ बी ⋈ सी ⋈ डी

सभी सभी k सब में निहित के लिए एक महत्वपूर्ण आम पर होते मिलती है ए, बी, सी, डी

तब:

  • ⋈ जुड़ने के क्रम को बदलकर प्रदर्शन में अंतर आएगा?
  • ⋈ के परिवर्तन को बदलने से परिणाम बदल जाएगा?

मुझे लगता है कि यह परिणाम को प्रभावित नहीं करेगा, लेकिन यह प्रदर्शन को प्रभावित करेगा या नहीं, मुझे यकीन नहीं है!

अद्यतन:

विल एसक्यूएल सर्वर स्वचालित रूप से बेहतर प्रदर्शन परिणाम सेट संभालने क्रम से स्वतंत्र हो जाएगा के लिए मिलती है को पुनर्व्यवस्थित?

+1

परिणाम वही होना चाहिए। प्रदर्शन की जांच करना काफी आसान है। उस समय की तुलना करें जब आप कुछ अलग-अलग हिट से रिवर्स ऑर्डर तक टेबल ऑर्डर करते हैं। –

+0

क्यों कोशिश नहीं करें? विभिन्न combos के लिए निष्पादन योजनाओं और एसक्यूएल प्रोफाइलर निशान देखें? – EBarr

+0

जब आप अलग-अलग आदेश कहते हैं तो आपका मतलब है: '(एक पूर्ण जॉइन बी) पूर्ण जॉइन सी' बनाम एक पूर्ण जॉइन (बी पूर्ण जॉइन सी) उदाहरण के लिए? –

उत्तर

8

नहीं, जॉइन ऑर्डर को पुनर्व्यवस्थित करना प्रदर्शन को प्रभावित नहीं करना चाहिए। एमएसएसक्यूएल (अन्य डीबीएमएस के साथ) में query optimizer है जिसका काम किसी भी दिए गए प्रश्न के लिए सबसे कुशल क्वेरी योजना ढूंढना है। आम तौर पर, ये एक बहुत अच्छी नौकरी करते हैं - इसलिए आप आसानी से अनुकूलक को हरा सकते हैं।

उन्होंने कहा, वे कभी-कभी गलत हो जाते हैं। यही वह जगह है जहां reading an execution plan खेल में आता है। आप MSSQL को अपनी तालिकाओं में शामिल होने के लिए JOIN hints जोड़ सकते हैं (जिस बिंदु पर, मामले का आदेश देता है)। आप आम तौर पर सबसे छोटी से सबसे बड़ी तालिका से ऑर्डर करेंगे (हालांकि, FULL JOIN के साथ, इसमें बहुत अधिक संभावना नहीं है) और rules of thumb का उपयोग प्रकारों के लिए करें।

चूंकि आप FULL JOINS कर रहे हैं, तो आप मूल रूप से डिस्क से 4 टेबल की पूरी तरह से पढ़ रहे हैं। यह बहुत महंगा होने की संभावना है। आप समस्या की फिर से जांच कर सकते हैं, और देख सकते हैं कि इसे एक अलग तरीके से पूरा किया जा सकता है या नहीं।

+1

+1: ओपी को - यह ध्यान रखना महत्वपूर्ण है कि एसक्यूएल को मूल रूप से और नैतिक रूप से निष्पादित नहीं किया गया है। ऑप्टिमाइज़र को आपकी समस्या के कार्यात्मक विवरण को बताने के लिए यह प्रभावी रूप से एक अलौकिक अभिव्यक्ति है। ऑप्टिमाइज़र तब प्रभावी रूप से इसे संकलित करता है और एक ऐसी योजना निष्पादित करता है जिसे एसक्यूएल के लगभग पूरी तरह से स्वतंत्र माना जा सकता है। – MatBailie

0

पूर्ण बाहरी शामिल होने के क्रम को बदलने से प्रदर्शन या परिणामों को प्रभावित नहीं होना चाहिए। एक पूर्ण चीज जो पूर्ण बाहरी जुड़ाव के आधार पर प्रभावित होगी, एक चयन * का उपयोग करते हुए उत्पादित कॉलम का डिफ़ॉल्ट क्रम है। बड़ी टेबल के साथ कई जुड़ने की कोशिश करने से आपको प्रदर्शन समस्याएं हो सकती हैं। यदि टेबल को सीमित करने के लिए कोई खंड नहीं है, तो आप सैकड़ों हजारों परिणामों के माध्यम से जा सकते हैं।

3
  • ⋈ परिणाम बदलने के परिणाम बदल जाएगा?

नहीं, FULL JOIN का आदेश कोई फर्क नहीं पड़ता, परिणाम वही होगा। लेकिन सूचना है कि आप (मिलती है की आदेश पर निम्नलिखित अलग परिणाम दे सकता है निर्भर करता है) कुछ इस तरह उपयोग नहीं कर सकते:

SELECT 
    COALESCE(a.id, b.id, c.id, d.id) AS id, --- Key columns used in FULL JOIN 
    a.*, b.*, c.*, d.*      --- other columns     
FROM a 
    FULL JOIN b 
     ON b.id = a.id 
    FULL JOIN c 
     ON c.id = a.id 
    FULL JOIN d 
     ON d.id = a.id ; 

आप कुछ इस तरह (कोई अंतर का उपयोग करना

SELECT 
    COALESCE(a.id, b.id, c.id, d.id) AS id, 
    a.*, b.*, c.*, d.*         
FROM a 
    FULL JOIN b 
     ON b.id = a.id 
    FULL JOIN c 
     ON c.id = COALESCE(a.id, b.id) 
    FULL JOIN d 
     ON d.id = COALESCE(a.id, b.id, c.id) ; 

    : परिणाम जो कुछ के आदेश मिलती) में
  • ⋈ जुड़ने के क्रम को बदलकर प्रदर्शन में अंतर आएगा?

विचार दूसरे और तीसरे मिलती है कि स्तंभों की COALESCE() और नहीं कॉलम खुद को पर किया जा करने के लिए है में रखते हुए, मैं सिर्फ बड़ा पर्याप्त तालिकाओं के साथ परीक्षण कर लगता है कि अगर अनुक्रमित प्रभावी ढंग से इस्तेमाल किया जा सकता दिखाएगा।

+0

मेरे पास कोई समेकित स्थिति नहीं है। इसके अलावा, सवाल में अद्यतन देखें! –

+0

@ युगल: इसका मतलब क्या है? क्या आप अपनी क्वेरी के 2 संस्करण पोस्ट कर सकते हैं ताकि हम समझ सकें कि आपका क्या मतलब है? यदि आप 'COALESCE() 'का उपयोग नहीं करते हैं तो आप कैसे जुड़ रहे हैं? –

+0

एचएम .. कुछ (जैसे एएसपी = बीएसपी पर ए ⋈ बी) एएसपी = सीएसपी पर ⋈ सी और इसी तरह .. –

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