कॉनटेनटेशन फिजिकल ऑपरेशन: क्या यह निष्पादन के आदेश की गारंटी देता है?


12

मानक SQL में, union allकिसी भी क्रम में होने की गारंटी नहीं है। तो, कुछ इस तरह:

select 'A' as c union all select 'B'

किसी भी क्रम में दो पंक्तियों को वापस कर सकता है (हालांकि, किसी भी डेटाबेस पर मैं जानता हूं, 'ए' 'बी' से पहले आएगा)।

SQL सर्वर में, यह एक "कॉन्कैटेनशन" भौतिक ऑपरेशन का उपयोग करके एक निष्पादन योजना में बदल जाता है।

मैं आसानी से कल्पना कर सकता था कि संघ संचालन अपने इनपुट को स्कैन करेगा, जो कुछ भी इनपुट उपलब्ध है उसे वापस लौटाएगा। हालाँकि, मुझे वेब पर निम्नलिखित विवरण मिला ( यहाँ ):

क्वेरी प्रोसेसर इस योजना को इस क्रम में निष्पादित करेगा कि ऑपरेटर योजना में दिखाई देते हैं, पहला शीर्ष एक है और अंतिम अंतिम है।

प्रश्न: क्या यह व्यवहार में सच है? क्या यह सच होने की गारंटी है?

मुझे Microsoft दस्तावेज़ीकरण में कोई संदर्भ नहीं मिला है कि इनपुट पहले से अंतिम क्रम में स्कैन किए गए हैं। दूसरी ओर, जब भी मैं इसे चलाने की कोशिश करता हूं, तो परिणाम बताते हैं कि इनपुट वास्तव में, क्रम में संसाधित हैं।

क्या एक बार में एक से अधिक इनपुट से इंजन की प्रक्रिया करने का कोई तरीका है? मेरे परीक्षण (स्थिरांक की तुलना में बहुत अधिक जटिल अभिव्यक्ति का उपयोग करना) एक समानांतर-सक्षम 8-कोर मशीन पर हैं, और अधिकांश प्रश्न समानांतरता का लाभ उठाते हैं।

जवाबों:


10

नहीं , Microsoft के व्यवहार की गारंटी से कोई प्रलेखन नहीं है, इसलिए इसकी गारंटी नहीं है

इसके अतिरिक्त, यह मानते हुए कि सरल टॉक लेख सही है, और यह कि कॉनकैटैनेशन फिजिकल ऑपरेटर हमेशा योजना में दिखाए गए क्रम में इनपुट की प्रक्रिया करता है (बहुत हद तक सच होने की संभावना है), फिर बिना किसी गारंटी के कि SQL Server हमेशा ऐसी योजनाएं बनाएगा जो समान रहें क्वेरी पाठ और क्वेरी योजना के बीच का क्रम, आप केवल थोड़ा बेहतर हैं।

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

SELECT * FROM sys.dm_exec_query_transformation_stats 
    WHERE name LIKE '%CON%' OR name LIKE '%UNIA%'

SQL सर्वर 2012 एंटरप्राइज़ संस्करण पर, यह 24 पंक्तियों का उत्पादन करता है। स्थिरांक से संबंधित परिवर्तनों के लिए झूठे मेलों को नजरअंदाज करना, कॉन्टैटेनेशन फिजिकल ऑपरेटर UNIAtoCON(यूनियन ऑल टू कॉनटेनेशन) से संबंधित एक परिवर्तन है । इसलिए, भौतिक ऑपरेटर स्तर पर, यह प्रतीत होता है कि एक बार एक संघचालक का चयन करने के बाद, इसे उस तार्किक यूनियन ऑल ऑपरेटर के क्रम में संसाधित किया जाएगा जहां से इसे प्राप्त किया गया था।


वास्तव में यह बिल्कुल सच नहीं है। पोस्ट-ऑप्टिमाइज़ेशन रीराइट्स मौजूद हैं जो लागत-आधारित ऑप्टिमाइज़ेशन के पूरा होने के बाद एक भौतिक कॉन्टैक्शन ऑपरेटर को इनपुट को फिर से व्यवस्थित कर सकते हैं। एक उदाहरण तब होता है जब Concatenation एक पंक्ति लक्ष्य के अधीन होता है (इसलिए पहले सस्ता इनपुट से पढ़ना महत्वपूर्ण हो सकता है)। अधिक विवरण के लिए पॉल व्हाइट द्वारा UNION ALLअनुकूलन देखें ।

यह देर से भौतिक पुनः लेखन SQL Server 2008 R2 के लिए और कार्यात्मक था, लेकिन एक प्रतिगमन का मतलब यह था कि यह अब SQL सर्वर 2012 और बाद में लागू नहीं होगा। एक निर्धारण जारी किया गया है जो SQL सर्वर 2014 और बाद में (2012 नहीं) क्वेरी ऑप्टिमाइज़र हॉटफ़िक्स सक्षम (जैसे ट्रेस ध्वज 4199) के साथ इस पुनर्लेखन को पुनर्स्थापित करता है।


लेकिन लॉजिकल यूनियन ऑल ऑपरेटर ( UNIA) के बारे में? एक UNIAReorderInputsपरिवर्तन है, जो इनपुट को फिर से व्यवस्थित कर सकता है। दो भौतिक ऑपरेटर भी हैं जिनका उपयोग तार्किक संघ सभी को लागू करने के लिए किया जा सकता है, UNIAtoCONऔर UNIAtoMERGE(यूनियन ऑल टू मर्ज यूनियन)।

इसलिए ऐसा प्रतीत होता है कि क्वेरी ऑप्टिमाइज़र इनपुट को फिर से चालू कर सकता है UNION ALL; हालाँकि, यह एक सामान्य परिवर्तन नहीं प्रतीत होता है ( UNIAReorderInputsSQL सर्वर पर शून्य उपयोग जो मैंने आसानी से सुलभ है। हम उन परिस्थितियों को नहीं जानते हैं जो अनुकूलक का उपयोग करेंगी UNIAReorderInputs; हालाँकि यह योजना गाइड या उपयोग के समय निश्चित रूप से उपयोग की जाती है; योजना संकेत का उपयोग उपर्युक्त उल्लिखित पंक्ति लक्ष्य भौतिक पुन: व्यवस्थित इनपुट का उपयोग करके उत्पन्न योजना को बाध्य करने के लिए किया जाता है।

क्या एक बार में एक से अधिक इनपुट से इंजन की प्रक्रिया करने का कोई तरीका है?

कॉन्टेनेटेशन फिजिकल ऑपरेटर किसी योजना के समानांतर सेक्शन में मौजूद हो सकता है। कुछ कठिनाई के साथ, मैं निम्नलिखित क्वेरी का उपयोग करके समांतर समाप् त योजना तैयार करने में सक्षम था:

SELECT userid, regdate  FROM (  --Users table is around 3mil rows
    SELECT  userid, RegDate FROM users WHERE userid > 1000000
    UNION 
    SELECT  userid, RegDate FROM users WHERE userid < 1000000
    UNION all
    SELECT userid, RegDate FROM users WHERE userid < 2000000
    ) d ORDER BY RegDate OPTION (RECOMPILE)

इसलिए, सबसे सख्त अर्थ में, शारीरिक संबंध ऑपरेटर हमेशा एक सुसंगत फैशन में इनपुट की प्रक्रिया करता है (शीर्ष एक पहले, निचला भाग); हालाँकि, ऑप्टिमाइज़र भौतिक ऑपरेटर को चुनने से पहले इनपुट के क्रम को बदल सकता है, या एक कॉनटेनमेंट के बजाय मर्ज यूनियन का उपयोग कर सकता है।


8

क्रेग फ्रीडमैन के अनुसार संघटन ऑपरेटर के लिए निष्पादन के आदेश की गारंटी है।

MSDN ब्लॉग्स पर क्वेरी योजनाओं को देखने वाले अपने ब्लॉग पोस्ट से :

ध्यान दें कि जब एक ऑपरेटर के एक से अधिक बच्चे होते हैं, तो बच्चों का क्रम मायने रखता है। सबसे ऊपर का बच्चा पहला बच्चा है, जबकि सबसे बड़ा बच्चा दूसरा है। संघचालक इस क्रम में बच्चों को संसाधित करता है।

और किताबों से ऑनलाइन Showplan तार्किक और शारीरिक संचालक संदर्भ

कॉनटैनेशन फिजिकल ऑपरेटर के पास दो या दो से अधिक इनपुट और एक आउटपुट होता है। कॉन्टेनेटेशन पंक्तियों को पहले इनपुट स्ट्रीम से आउटपुट स्ट्रीम में कॉपी करता है, फिर प्रत्येक अतिरिक्त इनपुट स्ट्रीम के लिए इस ऑपरेशन को दोहराता है।


वह बोली, मैं जो चाह रही थी, उसके बहुत करीब है। मैं उस क्रम में निष्पादित होने के क्रम में छलांग लेने को तैयार हूं - हालांकि यह निराशाजनक है कि प्रलेखन इस मामले में समानांतर प्रसंस्करण को रोकता है।
गॉर्डन लिनोफ

2

सामुदायिक विकि उत्तर :

मुझे नहीं पता कि क्या आप यह साबित कर सकते हैं कि किसी भी देखे गए व्यवहार की हमेशा गारंटी दी जाती है, एक ही रास्ता या दूसरा, जब तक आप एक काउंटर-उदाहरण का निर्माण नहीं कर सकते। उसके अभाव में, परिणाम को वापस करने के आदेश को ठीक करने का तरीका, निश्चित रूप से, एक जोड़ना है ORDER BY

मुझे नहीं पता कि क्या कोई "फ़िक्स" है, या कि फ़िक्स की आवश्यकता मौजूद है, यदि आप यह प्रदर्शित कर सकते हैं कि कुछ परिदृश्यों में प्रश्नों को एक अलग क्रम में संसाधित किया गया है।

किसी भी स्पष्ट, आधिकारिक दस्तावेज की कमी मुझे सुझाव देती है कि आपको इस पर निर्भर नहीं होना चाहिए। यह ठीक उसी तरह की चीज है जो लोगों को ORDER BYएक दृश्य में परेशानी में डालती है , और GROUP BYबिना ORDER BY, 8 साल पहले जब SQL सर्वर 2005 का अनुकूलक जारी किया गया था।

SQL सर्वर के नए संस्करणों (और अधिक आने के साथ) में सभी नई सुविधाओं के साथ, भले ही आपको लगता है कि आप आज एक विशिष्ट व्यवहार की गारंटी दे सकते हैं, मैं यह सच होने की उम्मीद नहीं करूंगा (जब तक कि ऐसा करने के लिए दस्तावेज नहीं किया जाता है)।

यहां तक ​​कि अगर आप इस व्यवहार पर निर्भर नहीं हैं, तो आप परिणामों के साथ क्या करने जा रहे हैं? वैसे भी, मैं एक बाहरी अधिकारी द्वारा एक साधारण बात लेख नहीं कहूंगा । हम सभी जानते हैं कि यह केवल अवलोकन पर आधारित एक अनुमान है।

Microsoft कभी भी आधिकारिक दस्तावेज प्रकाशित करने के लिए नहीं कह रहा है कि 'x' को 'y' करने की गारंटी नहीं है । यह एक कारण है कि हम अभी भी, लगभग एक दशक बाद, लोगों को यह समझाने में परेशानी करते हैं कि वे बिना देखे गए आदेश पर भरोसा नहीं कर सकते हैं ORDER BY- कोई दस्तावेज नहीं है जो कहता है कि "इसकी गारंटी नहीं है।"

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