2016-11-10 7 views
7

मैं वर्तमान में एसक्यूएल सर्वर में कार्यों के बारे में सीख रहा हूं और मुझे समझ में नहीं आता कि आप inline table valued function का उपयोग क्यों करेंगे।आप एक टेबल-मूल्यवान फ़ंक्शन का उपयोग कब करेंगे?

मैंने इसके बारे में पढ़ने और कुछ उदाहरणों को पढ़ने की कोशिश की है लेकिन यह अभी भी मेरे लिए अस्पष्ट है। क्या कोई उपयोग-परिदृश्य परिदृश्य को समझने में आसान समझ सकता है या प्रदान कर सकता है?

+1

हालांकि मैंने करीब (बहुत व्यापक) मतदान किया, एक ऐसी स्थिति जहां आप एक टेबल मूल्यवान फ़ंक्शन चाहते हैं, जब आप एक ऐसा दृश्य चाहते हैं जो पैरामीटर ले सके। –

+3

"स्ट्रिंग स्प्लिटर" के लिए खोजें और आप तालिका मूल्यवान फ़ंक्शन का एक बहुत ही सामान्य उपयोग देखेंगे। आप उन्हें बहुत उपयोगी चीजों को करने के लिए जुड़ने या क्रॉस लागू करने में उपयोग करते हैं। – pmbAustin

+0

एक विभाजित कार्य के साथ-साथ सीमित मूल्यों पर भी। –

उत्तर

9

तालिका-मूल्यवान फ़ंक्शन "बस" पैरामीटर किए गए दृश्य हैं। यह उन्हें तर्क को समाहित करने के लिए बेहद शक्तिशाली बनाता है जो अन्यथा एक अपारदर्शी संग्रहीत प्रक्रिया के पीछे छिपा होगा।

इनलाइन टेबल-मान समारोह:

create function dbo.GetClients (
    @clientName nvarchar(50) = null 
) 
returns table 
return (
    select * 
    from dbo.Clients as a 
    where ((a.ClientName = @clientName) or a.ClientName is null) 
); 

संग्रहित प्रक्रिया: यहाँ एक उदाहरण है

create procedure dbo.usp_GetClients (
    @clientName nvarchar(50) = null 
) 
as 
begin; 
    select * 
    from dbo.Clients as a 
    where ((a.ClientName = @clientName) or a.ClientName is null) 
end; 

संग्रहीत प्रक्रिया कॉल के विपरीत, एक मेज-मान समारोह मुझे लिखने देता है अन्य वस्तुओं के साथ dbo.GetClients से तर्क:

select * 
from dbo.GetClients(N'ACME') as a 
join ... as b 
    on a.ClientId = b.ClientId 

ऐसी स्थितियों में मैं संग्रहित प्रक्रिया का उपयोग करके कल्पना नहीं कर सकता क्योंकि तालिका-मूल्यवान फ़ंक्शन की तुलना में यह कितना प्रतिबंधित है। मुझे कई ऑब्जेक्ट्स के परिणामों को गठबंधन करने के लिए एक temp table, table variable, या अनुप्रयोग परत का उपयोग करके अपने आस-पास के डेटा को मार्शल करने के लिए मजबूर होना होगा।

इनलाइन टेबल-मूल्यवान फ़ंक्शंस विशेष रूप से "इनलाइन" बिट की वजह से शानदार हैं जो शायद here सर्वोत्तम रूप से समझाया गया है। यह ऑप्टिमाइज़र को ऐसे कार्यों का इलाज करने की अनुमति देता है जो वे इन वस्तुओं को अलग करते हैं, जिसके परिणामस्वरूप इष्टतम प्रदर्शन योजनाएं होती हैं (यह मानते हुए कि आपकी अनुक्रमणिका और आंकड़े आदर्श हैं)।

4

यह एक अच्छा सवाल है और एक विषय है जिस पर पर्याप्त IMHO पर चर्चा नहीं की गई है। इनलाइन टेबल मूल्यवान कार्यों के बारे में सोचें जो पैरामीटर स्वीकार करते हैं। यह छोटा जवाब है लेकिन चलो थोड़ा गहरा खोदना ...

SQL सर्वर में आपके पास तीन प्रकार के उपयोगकर्ता परिभाषित फ़ंक्शंस हैं *: स्केलर फ़ंक्शंस (एसवीएफ), बहु-पंक्ति तालिका मूल्यवान फ़ंक्शन (एमटीवीएफ) और इनलाइन तालिका मूल्यवान कार्य (आईटीवीएफ)। svfs एक एकल मान लौटाता है, दोनों एमटीवीएफ और आईटीवीएफ एक टेबल लौटाते हैं। एमटीवीएफ और आईटीवीएफ के बीच का अंतर प्रदर्शन है। संक्षेप में - एमटीवीएफ धीमे हैं, आईटीवीएफ (और लगभग हमेशा) बहुत तेज़ हो सकते हैं। एमटीवीएफ आपको ऐसी चीजों को करने की इजाजत देता है जो आप दृश्य में नहीं कर सकते हैं (उदाहरण के लिए अस्थायी सारणी बनाएं, लूप करें, कर्सर का उपयोग करें ...), iTVFs, फिर भी, पैरामीटर को छोड़कर छोड़कर विचारों के समान प्रतिबंध हैं।

मैं सामान्य डेटा वेयरहाउस प्रश्नों के लिए आईटीएफवी का उपयोग करता हूं जहां मुझे एक दृश्य की आवश्यकता होती है जो पैरामीटर और विभाजन/मैनिपुलेटिंग स्ट्रिंग लेता है। जो मेरे कैरियर बदल गया है iTVFs का एक और अधिक उन्नत उपयोग iTVFs साथ अदिश कार्यों को बदल रहा है - शीर्षक से जेफ Moden का यह लेख देखें, "कैसे अदिश UDFs भागो तेज़ बनाने के लिए": http://www.sqlservercentral.com/articles/T-SQL/91724/

  • सादगी के लिए मैं के विषय बाहर रखा गया सीएलआर और अन्य गैर टी-एसक्यूएल प्रकार के कार्यों।
संबंधित मुद्दे