बाहरी बाहरी बनाम लागू करें प्रदर्शन में शामिल हों


37

मैं SQL सर्वर 2008 R2 का उपयोग कर रहा हूं

मैं सिर्फ SQL में APPLY भर में आया और प्यार करता था कि यह इतने सारे मामलों के लिए क्वेरी समस्याओं को हल करता है,

परिणाम प्राप्त करने के लिए मैं जिन 2 तालिकाओं का उपयोग कर रहा था उनमें से कई, मैं 1 बाहरी आवेदन में प्राप्त करने में सक्षम था।

मेरे स्थानीय DB टेबल में डेटा की मात्रा कम है और तैनाती के बाद कोड को कम से कम 20 बार डेटा पर चलना चाहिए।

मुझे चिंता है कि बाहरी आवेदन में बड़ी मात्रा में डेटा के लिए 2 शेष ज्वाइन शर्तों से अधिक समय लग सकता है,

क्या कोई बता सकता है कि वास्तव में काम कैसे लागू होता है और यह बहुत बड़े डेटा में प्रदर्शन को कैसे प्रभावित करेगा, यदि संभव हो तो प्रत्येक तालिका के आकार के साथ कुछ आनुपातिक संबंध जैसे n1 ^ 1 या n1 ^ 2 ... जहां n1 तालिका में पंक्तियों की संख्या है। 1।

यहाँ 2 लेफ्ट जॉइन की क्वेरी है

select EC.*,DPD.* from Table1 eC left join
  (
   select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2
   group by member_id,parent_gid,child_gid,LOB,group_gid

  ) DPD2 on DPD2.parent_gid = Ec.parent_gid
        AND DPD2.child_gid = EC.child_gid
        AND DPD2.member_id = EC.member_id
        AND DPD2.LOB = EC.default_lob
        AND DPD2.group_gid = EC.group_gid
  left join
  Table2 dpd on dpd.parent_gid = dpd2.parent_gid 
            and dpd.child_gid = dpd2.child_gid
            and dpd.member_id = dpd2.member_id 
            and dpd.group_gid = dpd2.group_gid 
            and dpd.LOB = dpd2.LOB
            and dpd.table2_sid = dpd2.mdsid

यहाँ बाहरी अनुप्रयोग के साथ क्वेरी है

select * from Table1 ec   
OUTER APPLY (
      select top 1 grace_begin_date,retroactive_begin_date,Isretroactive
                    from Table2 DPD 
                    where DPD.parent_gid = Ec.parent_gid
                    AND DPD.child_gid = EC.child_gid
                    AND DPD.member_id = EC.member_id
                    AND DPD.LOB = EC.default_lob
                    AND DPD.group_gid = EC.group_gid
                    order by DPD.table2_sid desc
     ) DPD 

जवाबों:


44

क्या कोई बता सकता है कि वास्तव में काम कैसे लागू होता है और यह बहुत बड़े डेटा में प्रदर्शन को कैसे प्रभावित करेगा

APPLYएक सहसंबंधित जुड़ाव है (जिसे LATERAL JOINकुछ उत्पादों में कहा जाता है और SQL मानक के नए संस्करण)। किसी भी तार्किक निर्माण की तरह, इसका प्रदर्शन पर कोई सीधा प्रभाव नहीं है। सिद्धांत रूप में, हमें किसी भी तार्किक समकक्ष वाक्यविन्यास का उपयोग करके एक क्वेरी लिखने में सक्षम होना चाहिए, और अनुकूलक हमारे इनपुट को बिल्कुल उसी भौतिक निष्पादन योजना में बदल देगा।

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

के विशिष्ट रूप के OUTER APPLY ( SELECT TOP ... )परिणामस्वरूप सहसंबद्ध नेस्टेड छोरों के परिणामस्वरूप SQL सर्वर के वर्तमान संस्करणों में शामिल होने की संभावना है, क्योंकि ऑप्टिमाइज़र के पास इस पैटर्न को समकक्ष में बदलने के लिए तर्क नहीं है JOIN। बाहरी इनपुट बड़ा होने पर, सहसंबद्ध नेस्टेड लूप अच्छी तरह से प्रदर्शन नहीं कर सकते हैं, और आंतरिक इनपुट अनइंडेक्स है, या आवश्यक पृष्ठ पहले से ही मेमोरी में नहीं हैं। इसके अलावा, ऑप्टिमाइज़र के लागत मॉडल के विशिष्ट तत्वों का मतलब है कि एक सहसंबद्ध नेस्टेड लूप्स जुड़ना JOINएक समानांतर निष्पादन योजना का उत्पादन करने के लिए शब्दार्थ-समान की तुलना में कम संभावना है ।

मैं सिंगल लेफ्ट जॉइन और row_number () के साथ एक ही क्वेरी करने में सक्षम था

यह सामान्य मामले में बेहतर हो भी सकता है और नहीं भी। आपको प्रतिनिधि डेटा के साथ दोनों विकल्पों का प्रदर्शन करने की आवश्यकता होगी। LEFT JOINऔर ROW_NUMBERनिश्चित रूप से और अधिक कुशल हो की क्षमता है, लेकिन यह सटीक क्वेरी योजना आकार को चुना पर निर्भर करता है। इस दृष्टिकोण की दक्षता को प्रभावित करने वाले प्राथमिक कारक स्तंभों को कवर करने के लिए एक सूचकांक की उपलब्धता है, और इसके द्वारा आवश्यक आदेश की आपूर्ति करने के लिए PARTITION BYऔर ORDER BYखंड। एक दूसरा कारक तालिका का आकार है। एक कुशल और अच्छी तरह से अनुक्रमणित इष्टतम अनुक्रमण के साथ APPLYआउट-प्रदर्शन कर सकता है ROW_NUMBERयदि क्वेरी संबंधित तालिका के अपेक्षाकृत छोटे हिस्से को छूती है। परीक्षण की आवश्यकता है।


2

पहली क्वेरी sql सर्वर के केवल एक अनुरोध से समानांतर चल सकती है। इसने सारे रिकॉर्ड को प्राप्त किया और फ़िल्टर मानदंडों के आधार पर आउटपुट देता है।

लेकिन दूसरे एक के मामले में यह पंक्ति द्वारा पंक्ति चलाता है और प्रत्येक पंक्ति के लिए तालिका 2 को स्कैन किया जाएगा और परिणाम के लिए जोड़ा जाएगा।

यदि आपकी बाहरी क्वेरी का रिकॉर्ड कम है, तो दूसरा बेहतर है (OUTER APPLY)। लेकिन अगर पहले क्वेरी को अधिक डेटा मिल सकता है तो आपको पहले एक का उपयोग करना चाहिए।

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