2011-01-26 18 views
15

मेरे पास एक SQL क्वेरी है कि मैं एकाधिक संग्रहीत प्रक्रियाओं में पुन: उपयोग कर रहा हूं। क्वेरी एकाधिक तालिकाओं के खिलाफ काम करती है और इसे पारित 2 चर के आधार पर एक पूर्णांक मान देता है।दृश्य या फ़ंक्शन के साथ sql का पुन: उपयोग करें

बल्कि अलग संग्रहित प्रक्रियाओं में क्वेरी दोहरा की तुलना में मैं इसे साझा करना चाहते हैं और 2 विकल्प हैं:

  1. एक दृश्य के लिए जो मैं चर के आधार पर करने के लिए शामिल हो और इसे से पूर्णांक मान प्राप्त कर सकते हैं पैदा करते हैं।
  2. इसे करने के लिए पारित कर दिया मापदंड के साथ फिर से एक समारोह बना सकते हैं और वापस जाने के पूर्णांक चर

मैं विकल्प 1 की ओर झुकाव रहा हूँ, लेकिन राय है जिस पर बेहतर और आम बात है करना चाहते हैं। कौन सा होगा बेहतर प्रदर्शन बुद्धिमान आदि (किसी दृश्य में शामिल होने या बुला समारोह)

संपादित करें: आरडीबीएमएस एसक्यूएल सर्वर

उत्तर

13

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

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

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

इनलाइन टीवीएफ का उपयोग दक्षता लाभ as in this example के लिए स्केलर यूडीएफ को प्रतिस्थापित करने के लिए भी किया जा सकता है।

1

आप एक दृश्य में चर पारित नहीं हो सकता है, इसलिए अपने ही एकमात्र विकल्प यह लगता है एक का उपयोग करने के लिए है समारोह। इस के लिए दो विकल्प हैं:

  • एक अदिश समारोह
  • एक टेबल-मान समारोह (इनलाइन या बहु बयान)

आप रिकॉर्ड लौट रहे थे, तो आप एक कहां खंड इस्तेमाल कर सकते हैं एक बहुत ही जटिल दृश्य के बाहर से जो दृश्य में क्वेरी में रेखांकित हो सकता है, लेकिन चूंकि आप लौट रहे हैं, एक ही कॉलम integer value है, तो एक दृश्य काम नहीं करेगा।

एक इनलाइन टीवीएफ को क्वेरी ऑप्टिमाइज़र द्वारा बाहरी (कॉलिंग) क्वेरी के साथ मिलकर काम करने के लिए विस्तारित किया जा सकता है, इसलिए स्केलर फ़ंक्शन की तुलना में अधिकांश मामलों में यह तेज़ हो सकता है।

हालांकि, प्रयोगों अलग हैं - एक अदिश समारोह एकल मान तुरंत

select dbo.scalarme(col1, col2), other from .. 

रिटर्न जबकि एक इनलाइन-TVF या तो यह सबक्वेरी करने के लिए या क्रॉस एक और तालिका

select (select value from dbo.tvf(col1, col2)), other from .. 

-- or 

select f.value, t.other 
from tbl t 
CROSS apply dbo.tvf(col1, col2) f -- or outer apply 
+0

एक दृश्य एकल कॉलम एकल पंक्ति परिणाम लौटा सकता है। माना जाता है कि एक सामान्य मामला नहीं है लेकिन स्केलर यूडीएफ की तुलना में शायद अधिक कुशल है। संपादित करें - आह सही आप पैरामीटरकरण पहलू पर सवाल उठा रहे थे। मुझे लगता है कि दृश्य पर एक अनुमान के माध्यम से होगा। –

+0

मैं देखने के लिए में शामिल होने और एक के आधार पर परिणामों को प्रतिबंधित जहां खंड – amateur

+0

आप चाहते हैं सामान्य रूप से जहां खंड – Andomar

0

मैं क्योंकि मैं क्या प्रदर्शन के मामले में बेहतर है के बारे में निश्चित नहीं किया जा सकता कि आप एक आधा जवाब देने के लिए जा रहा हूँ, मैं माफी चाहता हूँ। लेकिन फिर अन्य लोगों को निश्चित रूप से उस स्कोर पर सलाह के अच्छे टुकड़े मिल गए हैं, मुझे यकीन है।

मैं प्रश्न के आपके 'सामान्य अभ्यास' भाग में रहूंगा।

तो, इस मामले में एक स्केलर फ़ंक्शन लकड़ी मुझे एक प्राकृतिक समाधान प्रतीत होता है। क्यों, आप केवल एक मान चाहते हैं, एक पूर्णांक मूल्य वापस किया जाना चाहिए - यह स्केलर फ़ंक्शंस के लिए है, है ना?

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

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

अब आपने कहा है कि आप केवल यह चुनने की योजना बना रहे हैं कि कौन सा विकल्प उपयोग करना है। फिर भी, उपर्युक्त पर विचार करते हुए, मुझे अभी भी लगता है कि विचार एक अच्छा विकल्प हो सकते हैं और आपके आवेदन को स्केल करते समय उपयोगी साबित हो सकते हैं, और आप वास्तव में दोनों विचारों और कार्यों का उपयोग कर सकते हैं (यदि केवल प्रदर्शन को बहुत परेशान नहीं किया गया है) जैसा कि मेरे पास है का वर्णन किया।

0

एक लाभ यह एक TVF एक दृश्य से अधिक है कि आप एक विशिष्ट सूचकांक लक्षित करने के लिए जो कोई भी यह कहता है मजबूर कर सकते हैं है।

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