क्या समानांतर स्केलर यूडीएफ के लिए समर्थन एक उचित सुविधा अनुरोध है?


10

यह काफी अच्छी तरह से प्रलेखित है कि स्केलर यूडीएफ के समग्र सीरियल प्लान को बल देता है।

समानांतर में कार्य चल रहा है

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

UDF के ब्लैक बॉक्स के कर्सर का उपयोग करने के बारे में दावे हैं। मैं देख सकता हूं कि उन मामलों के लिए एक उपयोगकर्ता कर्सर को एक एसपी के भीतर समानांतर नहीं किया जा सकता है, जहां कुछ राज्य पुनरावृत्तियों के बीच बनाए रखे जाते हैं, लेकिन ऐसा लगता है कि यह अन्यथा समानांतर होना चाहिए।

यह समझाने के लिए अतिरिक्त बिंदु कि इंजन केवल यूडीएफ गणना चरण के बजाय पूरी योजना को सीरियल बनाने के लिए क्यों मजबूर करता है।

समानांतर UDF के लिए समर्थन अनुरोध करने के लिए एक उचित सुविधा है?


1
उपयुक्त प्रतिक्रिया लगती है, आपके लिंक के स्वीकृत उत्तर पर ध्यान दिया जाता है, किसी भी स्केलर यूजर डिफाइंड फंक्शंस को सिंगल-कॉलम इनलाइन टेबल-वैल्यूड फंक्शंस के रूप में फिर से लिखने के लिए । ये दृश्य के रूप में उसी तरह विस्तारित होते हैं, और इस प्रकार पूरी तरह से अनुकूलित होते हैं। इस प्रकाश में, क्या आपका प्रश्न अभी भी योग्यता है?
पीटर जकरेंस

1
टीवीएफ वर्कअराउंड के साथ सफलता पर हाँ। मैंने पूछा क्योंकि इस तरह के प्राकृतिक निर्माण का उपयोग करने से बचना गलत है। इसके अलावा नए SQL डेवलपर्स से UDF इंटर्नल सीखने की अपेक्षा करना अव्यावहारिक लगता है।
क्रुकसेक

स्पष्ट टिप्पणी। ITVF के साथ सफलता लेकिन मल्टी-स्टेटमेंट TVF नहीं।
क्रुसेक

जवाबों:


17

यह काफी अच्छी तरह से प्रलेखित है कि यूडीएफ एक समग्र धारावाहिक योजना को मजबूर करता है।

मुझे यकीन नहीं है कि यह सब अच्छी तरह से प्रलेखित है।

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

एक समानांतर निष्पादन योजना और / या क्रेग फ्रीडमैन की समानांतर निष्पादन प्रस्तुति मजबूर करना देखें ।

यूडीएफ के बारे में दावा किया जा रहा है कि ब्लैक बॉक्स को कर्सर का उपयोग करना चाहिए।

ये दावे सही नहीं हैं।

यह समझाने के लिए अतिरिक्त बिंदु कि इंजन केवल यूडीएफ गणना चरण के बजाय पूरी योजना को सीरियल बनाने के लिए क्यों मजबूर करता है।

मेरी समझ यह है कि वर्तमान प्रतिबंध विशुद्ध रूप से कुछ कार्यान्वयन विवरणों का परिणाम हैं। समानता का उपयोग करके कार्यों को निष्पादित नहीं किया जा सकता है, इसका कोई मौलिक कारण नहीं है।

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

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

समानांतर UDF के लिए समर्थन अनुरोध करने के लिए एक उचित सुविधा है?

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


आप Microsoft पेपर पढ़ना पसंद कर सकते हैं:

... जो Microsoft SQL Server 2017 के बाद रिलीज़ में T-SQL स्केलर फ़ंक्शन प्रदर्शन समस्याओं को हल करने के लिए ले जाने के लिए Microsoft के दृष्टिकोण को रेखांकित करता है।

Froid का लक्ष्य डेवलपर्स को प्रदर्शन पर समझौता किए बिना UDFs और प्रक्रियाओं के अमूर्त उपयोग करने में सक्षम करना है। Froid एक लक्ष्य तकनीक का उपयोग करके इस लक्ष्य को प्राप्त करता है कि जब भी संभव हो, अनिवार्य संबंधपरक बीजीय रूपों में अनिवार्य रूप से रूपांतरित करने के लिए। संबंधात्मक अभिव्यक्तियों के रूप में अनिवार्य कोड के Froid मॉडल ब्लॉक, और व्यवस्थित रूप से उन्हें लागू ऑपरेटर का उपयोग करके एकल अभिव्यक्ति में जोड़ता है, जिससे क्वेरी ऑप्टिमाइज़र को कुशल सेट-ओरिएंटेड, समानांतर क्वेरी योजनाओं को चुनने में सक्षम किया जाता है ।

(जोर मेरा)


इनलाइन स्केलर टी-एसक्यूएल फ़ंक्शन अब SQL सर्वर 2019 में लागू किए गए हैं ।


11

जैसा कि पॉल ने अपने उत्तर में सही उल्लेख किया है, कोई भी मौलिक कारण नहीं है कि स्केलर यूडीएफ को समानता का उपयोग करके निष्पादित नहीं किया जा सकता है। हालांकि, कार्यान्वयन चुनौतियों के अलावा, उन्हें धारावाहिक होने के लिए मजबूर करने का एक और कारण है। Froid कागज पॉल द्वारा उद्धृत इस बारे में अधिक जानकारी देता है।

कागज से उद्धरण (धारा 2.3):

वर्तमान में, SQL सर्वर UDFs को आमंत्रित करने वाले प्रश्नों में इंट्रा-क्वेरी समानता का उपयोग नहीं करता है। इस सीमा को कम करने के लिए तरीके तैयार किए जा सकते हैं, लेकिन वे अतिरिक्त चुनौतियों का सामना करते हैं, जैसे कि यूडीएफ के प्रत्येक आह्वान के लिए समानता की सही डिग्री चुनना।

उदाहरण के लिए, एक यूडीएफ पर विचार करें जो अन्य एसक्यूएल प्रश्नों को आमंत्रित करता है, जैसे कि चित्र 1 में से प्रत्येक। ऐसी प्रत्येक क्वेरी स्वयं समानता का उपयोग कर सकती है, और इसलिए, ऑप्टिमाइज़र के पास यह जानने का कोई तरीका नहीं है कि उनके बीच धागे कैसे साझा करें, जब तक कि यह नहीं दिखता। UDF और प्रत्येक क्वेरी के लिए समानता की डिग्री तय करता है (जो संभवतः एक मंगलाचरण से दूसरे में बदल सकता है)। नेस्टेड और पुनरावर्ती यूडीएफ के साथ, यह मुद्दा प्रबंधित करना और भी कठिन हो जाता है।

Froid के दृष्टिकोण, जैसा कि कागज में वर्णित है, न केवल समानांतर योजनाओं में परिणाम देगा, बल्कि यूएएफएफ के साथ प्रश्नों के लिए कई और लाभ भी जोड़ता है। संक्षेप में, यह यूडीएफ के समानांतर निष्पादन के लिए आपके अनुरोध को ग्रहण करता है।

अद्यतन: Froid अब SQL Server 2019 पूर्वावलोकन की एक सुविधा के रूप में उपलब्ध है। फीचर को "स्केलर यूडीएफ इनलाइनिंग" कहा जाता है। अधिक विवरण यहां: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/11/07/introducing-scalar-udf-inlining/

[प्रकटीकरण: मैं Froid कागज के एक सह-लेखक हूँ]


बहुत अच्छा! अगर मुझे सही ढंग से समझ में आ रहा है तो यूडीएफ को प्रभावी ढंग से ऑटो-आईटीवीएफ में आंतरिक रूप से परिवर्तित करना है। हमने यह कुछ (w / घोष / अगर / और) के लिए किया था और एक अच्छा गड़बड़ कर दिया। हमारे पास एक डीबग "कॉलम" भी था।
क्रुकसेक

1
यह वास्तव में UDF को ITVF में परिवर्तित नहीं करता है, लेकिन आपका अंतर्ज्ञान सही है। SQL क्वेरी स्तर पर मैन्युअल रूप से ऐसा करना जटिल UDF के लिए वास्तव में गड़बड़ है। Froid यह परिवर्तन संबंधित बीजगणित के पेड़ पर करता है, जो गंदगी से बचता है :)
कार्तिक

@ कार्तिक क्या आप dba.stackexchange.com/questions/202211/… पर एक नज़र डाल सकते हैं । मैं वास्तव में जानना चाहता हूं कि वर्णित प्रकरण में फ्राइडे किस तरह का प्रदर्शन करने जा रहा है
रोमन पाकर

@Roman मैंने आपके सवाल पर टिप्पणी की है।
कार्तिक

1
धन्यवाद, @ कार्तिक, आपने जो काम Froid के पेपर पर किया है, उसके लिए और आपके (और समूहों के) स्केलर UDFs की प्रयोज्य को बेहतर बनाने के प्रयासों में :-)
सोलोमन रटज़स्की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.