2009-06-12 27 views
5

के बीच अंतर मैं फ़ंक्शंस का उपयोग करने में नौसिखिया हूं और ऐसा लगता है कि एक इनलाइन फ़ंक्शन एक दृश्य के समान है। क्या मैं सही हूँ?इनलाइन फ़ंक्शन और दृश्य

इसके अलावा, क्या मेरे पास एक फ़ंक्शन के भीतर अद्यतन विवरण हो सकते हैं?

उत्तर

-1

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

+1

लेकिन अधिकतम प्रदर्शन और पोर्टेबिलिटी के लिए आपको हमेशा एक समारोह पर एक दृश्य पसंद करना चाहिए। – RedFilter

0

एक दृश्य डेटा के "दृश्य" है जो एक क्वेरी से वापस आ गया है, लगभग एक छद्म-तालिका। एक फ़ंक्शन आमतौर पर डेटा पूछने से प्राप्त मूल्य/तालिका देता है। आप फ़ंक्शन में कोई भी SQL स्टेटमेंट चला सकते हैं बशर्ते फ़ंक्शन अंततः एक मान/तालिका लौटाए।

0

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

+0

लेकिन एक दृश्य उस राज्य का पर्दाफाश कर सकता है, और फिर आप एक खंड का उपयोग कर फ़िल्टर कर सकते हैं। – RedFilter

+0

यह सच है। लेकिन एक फ़ंक्शन कोड पढ़ने वाले प्रोग्रामर के लिए बेहतर दिखता है। * से चुनें * ग्राहक बायस्टेट ('आयोवा') से चयन करना आसान है * vCustomers से जहां राज्य = 'आयोवा'। हालांकि यह सिर्फ मेरी राय है। –

2

अद्यतन: ऐसा लगता है कि मुझे "इनलाइन" भाग याद आया। हालांकि, अगर कोई VIEWs और नियमित कार्यों के बीच अंतर के बारे में पढ़ना चाहता है तो मैं यहां जवाब छोड़ रहा हूं।

यदि आपके पास केवल एक ऐसा कार्य है जो डेटा को चुन और आउटपुट करता है, तो वे समान होते हैं। हालांकि, फिर भी, वे समान नहीं हैं क्योंकि इंजन द्वारा VIEW को अनुकूलित किया जा सकता है। उदाहरण के लिए, यदि आप SELECT * दृश्य 1 से चलाते हैं तो x = 10; और आपके पास टेबल फ़ील्ड पर इंडेक्स है जो एक्स को मैप करता है, फिर इसका उपयोग किया जाएगा। दूसरी तरफ, फ़ंक्शन खोज से पहले परिणाम सेट बनाता है, इसलिए आपको इसके अंदर कहां जाना होगा - हालांकि, यह आसान नहीं है क्योंकि आपके पास कई कॉलम हो सकते हैं और आप उसी चयन कथन में उन सभी के द्वारा ऑर्डर नहीं कर सकते हैं।

इसलिए, यदि आप डेटा पर "दृश्य" देने के समान कार्य के लिए विचारों और कार्यों की तुलना करते हैं, तो VIEWs बेहतर विकल्प हैं।

लेकिन, कार्य अधिक कुछ कर सकते हैं। जॉइन या यूनियन के साथ तालिकाओं में शामिल होने की आवश्यकता के बिना आप कई प्रश्न पूछ सकते हैं। आप परिणामों के साथ कुछ जटिल गणना कर सकते हैं, उपयोगकर्ता को अतिरिक्त प्रश्न और आउटपुट डेटा चला सकते हैं। कार्य संग्रहीत प्रक्रियाओं की तरह अधिक हैं जो डेटासेट वापस करने में सक्षम हैं, फिर वे विचारों की तरह हैं।

1

एक बड़ा अंतर यह है कि एक कार्य पैरामीटर ले सकता है जबकि एक दृश्य नहीं कर सकता है।

मैं मानक और इसलिए पोर्टेबल कार्यान्वयन होने के नाते VIEWs का पक्ष लेता हूं। मैं फ़ंक्शंस का उपयोग करता हूं जब समकक्ष दृश्य WHERE क्लॉज के बिना व्यर्थ होगा।

उदाहरण के लिए, मेरे पास एक ऐसा कार्य है जो अपेक्षाकृत बड़ी वैध-समय की स्थिति तालिका ('इतिहास' तालिका) से पूछताछ करता है। यदि यह एक दृश्य था और आपने बिना किसी WHERE क्लॉज के पूछने की कोशिश की तो आपको एक बहुत सारे डेटा मिलेंगे (अंत में!) फ़ंक्शन का उपयोग करके एक अनुबंध स्थापित होता है कि यदि आप डेटा चाहते हैं तो आपको एक ग्राहक आईडी, एक प्रारंभ तिथि और समाप्ति तिथि और कार्य यह है कि मैं इस संपर्क को कैसे स्थापित करता हूं। एक संग्रहित प्रो क्यों नहीं? खैर, मैं उम्मीद करता हूं कि उपयोगकर्ता परिणाम को डेटा (टेबल, व्यू, फ़ंक्शंस इत्यादि) में जॉइन करना चाहते हैं और एक फ़ंक्शन आईएमओ ऐसा करने का सबसे अच्छा तरीका है, इसके बजाय, उपयोगकर्ता को परिणाम अस्थायी रूप से परिणाम लिखने की आवश्यकता है तालिका।

3

कोई फर्क नहीं पड़ता। वे दोनों शामिल क्वेरी में विस्तार/unnested हैं।

नोट: अनुक्रमित विचारों को अलग-अलग माना जाता है लेकिन अभी भी विस्तारित किया जा सकता है, और बहु-मूल्यवान तालिका फ़ंक्शन युक्त क्वेरी में काले बक्से हैं।

Tony Rogerson: VIEWS - they offer no optimisation benefits; they are simply inline macros - use sparingly

Adam Machanic: Scalar functions, inlining, and performance: An entertaining title for a boring post

Related SO question: Does query plan optimizer works well with joined/filtered table-valued functions?

अंत में, तालिकाओं के लिए लिखते हैं कार्यों में अनुमति नहीं है

संपादित करें, एरिक जेड दाढ़ी की टिप्पणी और downvote के बाद ...

प्रश्न और उत्तर (केवल मेरी नहीं) स्केलर udfs के बारे में नहीं हैं। "इनलाइन" का अर्थ है "इनलाइन टेबल मूल्यवान फ़ंक्शन"। बहुत अलग अवधारणाएं ...

+0

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

+0

@Eric: इनलाइन टेबल मूल्यवान फ़ंक्शन के लिए, मैंने जो कहा वह सही है। मैंने कहा कि बहु मूल्यवान टीवीएफ काले बक्से हैं। प्रश्न और मेरा जवाब "स्केलर udfs" का उल्लेख नहीं करता है जो काले बक्से हैं। – gbn

+0

हाँ, मुझे "इनलाइन" याद आया, आप सही हैं। –

15

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

एक इनलाइन टीवीएफ बस एक पैरामीटर दृश्य है। इसे एक दृश्य की तरह विस्तारित और अनुकूलित किया जा सकता है। "परिणाम लौटने" या उससे पहले कुछ भी करने के लिए आवश्यक नहीं है (हालांकि, दुर्भाग्यवश, वाक्यविन्यास में RETURN है।

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

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

1

एक समारोह (msdn) में अपडेट के बारे में अपने प्रश्न का उत्तर देना:

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

2

कोई भी इस पहलू का उल्लेख नहीं करता है।

आप Update बयान एक इनलाइन समारोह में नहीं हो सकता है, लेकिन आप Update बयान के खिलाफ लिख सकते हैं उन्हें बस के रूप में ही वे एक updatable दृश्य थे।

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