Database
 sql >> डेटाबेस >  >> RDS >> Database

टेबल एक्सप्रेशन के फंडामेंटल, भाग 12 - इनलाइन टेबल-वैल्यूड फंक्शन्स

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

अपने उदाहरणों में मैं TSQLV5 नामक एक नमूना डेटाबेस का उपयोग करूँगा। आप इसे यहां और इसके ईआर आरेख को बनाने और पॉप्युलेट करने वाली स्क्रिप्ट यहां पा सकते हैं।

इनलाइन टेबल-वैल्यूड फंक्शन क्या है?

पहले से कवर किए गए नामित टेबल एक्सप्रेशन की तुलना में, iTVF ज्यादातर दृश्यों से मिलते जुलते हैं। विचारों की तरह, iTVF डेटाबेस में एक स्थायी वस्तु के रूप में बनाए जाते हैं, और इसलिए उन उपयोगकर्ताओं द्वारा पुन:प्रयोज्य होते हैं जिनके पास उनके साथ बातचीत करने की अनुमति होती है। विचारों की तुलना में आईटीवीएफ का मुख्य लाभ यह है कि वे इनपुट मापदंडों का समर्थन करते हैं। इसलिए, iTVF का वर्णन करने का सबसे आसान तरीका एक पैरामीटरयुक्त दृश्य है, हालांकि तकनीकी रूप से आप इसे CREATE FUNCTION स्टेटमेंट के साथ बनाते हैं, न कि CREATE VIEW स्टेटमेंट के साथ।

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

सिंटैक्स

आईटीवीएफ बनाने के लिए टी-एसक्यूएल सिंटैक्स यहां दिया गया है:

[या बदलें] फ़ंक्शन बनाएं [<स्कीमा नाम>। ] <फ़ंक्शन का नाम>

[ (<इनपुट पैरामीटर>) ]

रिटर्न टेबल

[ SCHEMABINDING सहित <फ़ंक्शन विशेषताओं के साथ> ]

एएस

वापसी

<तालिका अभिव्यक्ति> [; ]

सिंटैक्स में इनपुट पैरामीटर को परिभाषित करने की क्षमता का निरीक्षण करें।

SCHEMABIDNING विशेषता का उद्देश्य विचारों के समान है और समान विचारों के आधार पर मूल्यांकन किया जाना चाहिए। विवरण के लिए, श्रृंखला में भाग 10 देखें।

एक उदाहरण

iTVF के लिए एक उदाहरण के रूप में, मान लें कि आपको एक पुन:प्रयोज्य नामित तालिका अभिव्यक्ति बनाने की आवश्यकता है जो इनपुट के रूप में एक ग्राहक आईडी (@custid) और एक संख्या (@n) स्वीकार करती है और Sales.Orders तालिका से सबसे हाल के आदेशों की अनुरोधित संख्या लौटाती है। इनपुट ग्राहक के लिए।

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

फ़ंक्शन को लागू करने से पहले, Sales.Orders तालिका पर एक सहायक अनुक्रमणिका बनाने के लिए यहां कोड दिया गया है:

USE TSQLV5;
GO
 
CREATE INDEX idx_nc_cid_odD_oidD_i_eid
  ON Sales.Orders(custid, orderdate DESC, orderid DESC)
  INCLUDE(empid);

और यह फ़ंक्शन बनाने के लिए कोड है, जिसका नाम Sales.GetTopCustOrders है:

CREATE OR ALTER FUNCTION Sales.GetTopCustOrders
  ( @custid AS INT, @n AS BIGINT )
RETURNS TABLE
AS
RETURN
  SELECT TOP (@n) orderid, orderdate, empid
  FROM Sales.Orders
  WHERE custid = @custid
  ORDER BY orderdate DESC, orderid DESC;
GO

बेस टेबल और व्यू की तरह, जब आप डेटा प्राप्त करने के बाद होते हैं, तो आप एक सेलेक्ट स्टेटमेंट के FROM क्लॉज में iTVFs निर्दिष्ट करते हैं। ग्राहक 1 के लिए सबसे हाल के तीन आदेशों का अनुरोध करने का एक उदाहरण यहां दिया गया है:

SELECT orderid, orderdate, empid
FROM Sales.GetTopCustOrders(1, 3);

मैं इस उदाहरण को प्रश्न 1 के रूप में संदर्भित करूंगा। प्रश्न 1 की योजना चित्र 1 में दिखाई गई है।

चित्र 1:प्रश्न 1 के लिए योजना

iTVFs के बारे में इनलाइन क्या है?

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

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

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

चित्र 1 में योजना में देखें कि इंडेक्स सीक ऑपरेटर की तलाश विधेय और शीर्ष ऑपरेटर की शीर्ष अभिव्यक्ति दोनों वर्तमान क्वेरी निष्पादन से एम्बेडेड शाब्दिक स्थिरांक 1 और 3 दिखाते हैं। वे क्रमशः @custid और @n पैरामीटर नहीं दिखाते हैं।

iTVFs के साथ, पैरामीटर एम्बेडिंग ऑप्टिमाइज़ेशन डिफ़ॉल्ट रूप से उपयोग किया जाता है। संग्रहीत कार्यविधियों के साथ, पैरामीटरयुक्त प्रश्नों को डिफ़ॉल्ट रूप से अनुकूलित किया जाता है। पैरामीटर एम्बेडिंग ऑप्टिमाइज़ेशन का अनुरोध करने के लिए आपको संग्रहीत कार्यविधि की क्वेरी में OPTION(RECOMPILE) जोड़ने की आवश्यकता है। iTVF बनाम संग्रहीत कार्यविधियों के अनुकूलन पर अधिक विवरण, जिसमें निहितार्थ भी शामिल हैं, शीघ्र ही।

iTVFs के माध्यम से डेटा संशोधित करना

श्रृंखला के भाग 11 से स्मरण करें कि जब तक कुछ आवश्यकताओं को पूरा किया जाता है, नामित तालिका अभिव्यक्तियाँ संशोधन कथनों का लक्ष्य हो सकती हैं। यह क्षमता iTVF पर उसी तरह लागू होती है जिस तरह से यह विचारों पर लागू होती है। उदाहरण के लिए, यहां वह कोड है जिसका उपयोग आप ग्राहक 1 के तीन सबसे हाल के आदेशों को हटाने के लिए कर सकते हैं (वास्तव में इसे न चलाएं):

DELETE FROM Sales.GetTopCustOrders(1, 3);

विशेष रूप से हमारे डेटाबेस में, इस कोड को चलाने का प्रयास रेफ़रेंशियल अखंडता प्रवर्तन (प्रभावित ऑर्डर से संबंधित ऑर्डर लाइन Sales.OrderDetails तालिका में होता है) के कारण विफल हो जाएगा, लेकिन यह मान्य और समर्थित कोड है।

iTVF बनाम संग्रहीत कार्यविधियाँ

जैसा कि पहले उल्लेख किया गया है, iTVFs के लिए डिफ़ॉल्ट क्वेरी अनुकूलन रणनीति संग्रहीत प्रक्रियाओं के लिए एक से अलग है। iTVFs के साथ, पैरामीटर एम्बेडिंग ऑप्टिमाइज़ेशन का उपयोग करना डिफ़ॉल्ट है। संग्रहीत प्रक्रियाओं के साथ, पैरामीटर सूँघने के दौरान पैरामीटरयुक्त प्रश्नों को अनुकूलित करने के लिए डिफ़ॉल्ट है। संग्रहीत कार्यविधि क्वेरी के लिए पैरामीटर एम्बेडिंग प्राप्त करने के लिए, आपको OPTION(RECOMPILE) जोड़ने की आवश्यकता है।

कई अनुकूलन रणनीतियों और तकनीकों के साथ, पैरामीटर एम्बेडिंग के अपने प्लस और माइनस हैं।

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

पैरामीटर एम्बेडिंग ऑप्टिमाइज़ेशन का मुख्य माइनस यह है कि आपको कुशल योजना कैशिंग और पुन:उपयोग व्यवहार नहीं मिलता है जैसे आप पैरामीटरयुक्त योजनाओं के लिए करते हैं। पैरामीटर मानों के प्रत्येक विशिष्ट संयोजन के साथ, आपको एक अलग क्वेरी स्ट्रिंग मिलती है, और इसलिए एक अलग संकलन जिसके परिणामस्वरूप एक अलग कैश्ड योजना होती है। निरंतर इनपुट वाले आईटीवीएफ के साथ, आप योजना पुन:उपयोग व्यवहार प्राप्त कर सकते हैं, लेकिन केवल तभी जब समान पैरामीटर मान दोहराया जाता है। जाहिर है, OPTION(RECOMPILE) के साथ एक संग्रहीत कार्यविधि क्वेरी अनुरोध द्वारा समान पैरामीटर मानों को दोहराते हुए भी किसी योजना का पुन:उपयोग नहीं करेगी।

मैं तीन मामलों का प्रदर्शन करूंगा:

  1. स्थिरांक के साथ पुन:प्रयोज्य योजनाएं, स्थिरांक के साथ iTVF क्वेरी के लिए डिफ़ॉल्ट पैरामीटर एम्बेडिंग ऑप्टिमाइज़ेशन के परिणामस्वरूप होती हैं
  2. पैरामीटरयुक्त संग्रहीत कार्यविधि प्रश्नों के डिफ़ॉल्ट अनुकूलन के परिणामस्वरूप पुन:प्रयोज्य पैरामीटरयुक्त योजनाएं
  3. OPTION(RECOMPILE) के साथ संग्रहीत प्रक्रिया प्रश्नों के लिए पैरामीटर एम्बेडिंग ऑप्टिमाइज़ेशन के परिणामस्वरूप स्थिरांक वाली गैर-पुन:प्रयोज्य योजनाएं

आइए केस # 1 से शुरू करें।

हमारे iTVF को @custid =1 और @n =3 के साथ क्वेरी करने के लिए निम्न कोड का उपयोग करें:

SELECT orderid, orderdate, empid
FROM Sales.GetTopCustOrders(1, 3);

एक अनुस्मारक के रूप में, यह उसी कोड का दूसरा निष्पादन होगा क्योंकि आपने इसे पहले ही समान पैरामीटर मानों के साथ एक बार निष्पादित किया था, जिसके परिणामस्वरूप चित्र 1 में दिखाया गया प्लान है।

iTVF को @custid =2 और @n =3 से एक बार क्वेरी करने के लिए निम्न कोड का उपयोग करें:

SELECT orderid, orderdate, empid
FROM Sales.GetTopCustOrders(2, 3);

मैं इस कोड को क्वेरी 2 के रूप में संदर्भित करूंगा। प्रश्न 2 की योजना चित्र 2 में दिखाई गई है।

चित्र 2:क्वेरी 2 के लिए योजना

याद रखें कि प्रश्न 1 के लिए चित्र 1 में योजना खोज विधेय में स्थिर ग्राहक आईडी 1 को संदर्भित करती है, जबकि यह योजना निरंतर ग्राहक आईडी 2 को संदर्भित करती है।

क्वेरी निष्पादन आँकड़ों की जाँच के लिए निम्न कोड का उपयोग करें:

SELECT Q.plan_handle, Q.execution_count, T.text, P.query_plan
FROM sys.dm_exec_query_stats AS Q
  CROSS APPLY sys.dm_exec_sql_text(Q.plan_handle) AS T
  CROSS APPLY sys.dm_exec_query_plan(Q.plan_handle) AS P
WHERE T.text LIKE '%Sales.' + 'GetTopCustOrders(%';

यह कोड निम्न आउटपुट उत्पन्न करता है:

plan_handle         execution_count text                                           query_plan
------------------- --------------- ---------------------------------------------- ----------------
0x06000B00FD9A1...  1               SELECT ... FROM Sales.GetTopCustOrders(2, 3);  <ShowPlanXML...>
0x06000B00F5C34...  2               SELECT ... FROM Sales.GetTopCustOrders(1, 3);  <ShowPlanXML...>

(2 rows affected)

यहां दो अलग-अलग योजनाएं बनाई गई हैं:एक ग्राहक आईडी 1 वाली क्वेरी के लिए, जिसका दो बार उपयोग किया गया था, और दूसरी ग्राहक आईडी 2 वाली क्वेरी के लिए, जिसका एक बार उपयोग किया गया था। पैरामीटर मानों के अलग-अलग संयोजनों की एक बहुत बड़ी संख्या के साथ, आपके पास बड़ी संख्या में संकलन और संचित योजनाएँ होंगी।

आइए केस # 2 के साथ आगे बढ़ें:पैरामीटरयुक्त संग्रहीत कार्यविधि प्रश्नों की डिफ़ॉल्ट अनुकूलन रणनीति। Sales.GetTopCustOrders2:

नामक संग्रहित प्रक्रिया में हमारी क्वेरी को इनकैप्सुलेट करने के लिए निम्न कोड का उपयोग करें:
CREATE OR ALTER PROC Sales.GetTopCustOrders2
  ( @custid AS INT, @n AS BIGINT )
AS
  SET NOCOUNT ON;
 
  SELECT TOP (@n) orderid, orderdate, empid
  FROM Sales.Orders
  WHERE custid = @custid
  ORDER BY orderdate DESC, orderid DESC;
GO

संग्रहीत कार्यविधि को @custid =1 और @n =3 के साथ दो बार निष्पादित करने के लिए निम्न कोड का उपयोग करें:

EXEC Sales.GetTopCustOrders2 @custid = 1, @n = 3;
EXEC Sales.GetTopCustOrders2 @custid = 1, @n = 3;

पहला निष्पादन क्वेरी के अनुकूलन को ट्रिगर करता है, जिसके परिणामस्वरूप चित्र 3 में दिखाया गया पैरामीटरयुक्त योजना:

चित्र 3:बिक्री के लिए योजना।GetTopCustOrders2 खरीद

सीक विधेय में पैरामीटर @custid और शीर्ष अभिव्यक्ति में पैरामीटर @n के संदर्भ को देखें।

संग्रहीत कार्यविधि को @custid =2 और @n =3 के साथ एक बार निष्पादित करने के लिए निम्न कोड का उपयोग करें:

EXEC Sales.GetTopCustOrders2 @custid = 2, @n = 3;

चित्र 3 में दिखाया गया कैश्ड पैरामीटरयुक्त योजना का पुन:उपयोग किया जाता है।

क्वेरी निष्पादन आँकड़ों की जाँच के लिए निम्न कोड का उपयोग करें:

SELECT Q.plan_handle, Q.execution_count, T.text, P.query_plan
FROM sys.dm_exec_query_stats AS Q
  CROSS APPLY sys.dm_exec_sql_text(Q.plan_handle) AS T
  CROSS APPLY sys.dm_exec_query_plan(Q.plan_handle) AS P
WHERE T.text LIKE '%Sales.' + 'GetTopCustOrders2%';

यह कोड निम्न आउटपुट उत्पन्न करता है:

plan_handle         execution_count text                                            query_plan
------------------- --------------- ----------------------------------------------- ----------------
0x05000B00F1604...  3               ...SELECT TOP (@n)...WHERE custid = @custid...; <ShowPlanXML...>

(1 row affected)

बदलते ग्राहक आईडी मानों के बावजूद, केवल एक पैरामीटरयुक्त योजना बनाई गई और कैश की गई, और तीन बार उपयोग की गई।

आइए केस # 3 पर आगे बढ़ें। जैसा कि उल्लेख किया गया है, संग्रहीत प्रक्रिया प्रश्नों के साथ आप विकल्प (RECOMPILE) का उपयोग करते समय पैरामीटर एम्बेडिंग ऑप्टिमाइज़ेशन प्राप्त कर सकते हैं। इस विकल्प को शामिल करने के लिए प्रक्रिया क्वेरी को बदलने के लिए निम्नलिखित कोड का उपयोग करें:

CREATE OR ALTER PROC Sales.GetTopCustOrders2
  ( @custid AS INT, @n AS BIGINT )
AS
  SET NOCOUNT ON;
 
  SELECT TOP (@n) orderid, orderdate, empid
  FROM Sales.Orders
  WHERE custid = @custid
  ORDER BY orderdate DESC, orderid DESC
  OPTION(RECOMPILE);
GO

खरीद को @custid =1 और @n =3 के साथ दो बार निष्पादित करें:

EXEC Sales.GetTopCustOrders2 @custid = 1, @n = 3;
EXEC Sales.GetTopCustOrders2 @custid = 1, @n = 3;

आपको वही योजना मिलती है जो पहले चित्र 1 में एम्बेडेड स्थिरांक के साथ दिखाई गई थी।

खरीद को @custid =2 और @n =3 के साथ एक बार निष्पादित करें:

EXEC Sales.GetTopCustOrders2 @custid = 2, @n = 3;

आपको वही योजना मिलती है जो पहले चित्र 2 में एम्बेडेड स्थिरांक के साथ दिखाई गई थी।

क्वेरी निष्पादन आँकड़ों की जाँच करें:

SELECT Q.plan_handle, Q.execution_count, T.text, P.query_plan
FROM sys.dm_exec_query_stats AS Q
  CROSS APPLY sys.dm_exec_sql_text(Q.plan_handle) AS T
  CROSS APPLY sys.dm_exec_query_plan(Q.plan_handle) AS P
WHERE T.text LIKE '%Sales.' + 'GetTopCustOrders2%';

यह कोड निम्न आउटपुट उत्पन्न करता है:

plan_handle         execution_count text                                            query_plan
------------------- --------------- ----------------------------------------------- ----------------
0x05000B00F1604...  1               ...SELECT TOP (@n)...WHERE custid = @custid...; <ShowPlanXML...>

(1 row affected)

निष्पादन संख्या 1 दिखाती है, जो केवल अंतिम निष्पादन को दर्शाती है। SQL सर्वर अंतिम निष्पादित योजना को कैश करता है, इसलिए यह उस निष्पादन के लिए आँकड़े दिखा सकता है, लेकिन अनुरोध द्वारा, यह योजना का पुन:उपयोग नहीं करता है। यदि आप query_plan विशेषता के तहत दिखाई गई योजना की जांच करते हैं, तो आप पाएंगे कि यह अंतिम निष्पादन में स्थिरांक के लिए बनाई गई योजना है, जिसे पहले चित्र 2 में दिखाया गया है।

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

एक बड़ा फायदा यह है कि एक आईटीवीएफ-आधारित कार्यान्वयन में संग्रहीत प्रक्रिया-आधारित एक पर होता है-जब आपको किसी तालिका में प्रत्येक पंक्ति में फ़ंक्शन लागू करने की आवश्यकता होती है, और तालिका से कॉलम को इनपुट के रूप में पास करना होता है। उदाहरण के लिए, मान लें कि आपको Sales.Customers तालिका में प्रत्येक ग्राहक के लिए सबसे हाल के तीन ऑर्डर वापस करने होंगे। कोई क्वेरी निर्माण आपको तालिका में प्रति पंक्ति संग्रहीत कार्यविधि लागू करने में सक्षम नहीं बनाता है। आप एक कर्सर के साथ एक पुनरावृत्त समाधान लागू कर सकते हैं, लेकिन यह हमेशा एक अच्छा दिन होता है जब आप कर्सर से बच सकते हैं। APPLY ऑपरेटर को iTVF कॉल के साथ मिलाकर, आप कार्य को अच्छी तरह और सफाई से प्राप्त कर सकते हैं, जैसे:

SELECT C.custid, O.orderid, O.orderdate, O.empid
FROM Sales.Customers AS C
  CROSS APPLY Sales.GetTopCustOrders( C.custid, 3 ) AS O;

यह कोड निम्नलिखित आउटपुट उत्पन्न करता है (संक्षिप्त रूप में):

custid      orderid     orderdate  empid
----------- ----------- ---------- -----------
1           11011       2019-04-09 3
1           10952       2019-03-16 1
1           10835       2019-01-15 1
2           10926       2019-03-04 4
2           10759       2018-11-28 3
2           10625       2018-08-08 3
...

(263 rows affected)

फ़ंक्शन कॉल इनलाइन हो जाती है, और पैरामीटर @custid के संदर्भ को सहसंबंध C.custid से बदल दिया जाता है। यह चित्र 4 में दर्शाई गई योजना में परिणत होता है।

चित्र 4:आवेदन और बिक्री के साथ क्वेरी के लिए योजना। GetTopCustOrders iTVF

ग्राहक आईडी का सेट प्राप्त करने के लिए योजना Sales.Customers तालिका पर कुछ अनुक्रमणिका को स्कैन करती है और आपके द्वारा Sales.Orders प्रति ग्राहक पर पहले बनाए गए सहायक अनुक्रमणिका में एक खोज लागू करती है। केवल एक ही योजना है क्योंकि फ़ंक्शन बाहरी क्वेरी में इनलाइन हो गया है, एक सहसंबद्ध, या एक पार्श्व में शामिल हो गया है। यह योजना अत्यधिक कुशल है, विशेष रूप से जब Sales.Orders में ग्राहक का कॉलम बहुत सघन होता है, जिसका अर्थ है कि जब अलग-अलग ग्राहक ID की एक छोटी संख्या होती है।

बेशक, इस कार्य को लागू करने के अन्य तरीके भी हैं, जैसे ROW_NUMBER फ़ंक्शन के साथ CTE का उपयोग करना। जब Sales.Orders तालिका में कम घनत्व होता है तो ऐसा समाधान APPLY-आधारित समाधान से बेहतर काम करता है। किसी भी तरह से, मैंने अपने उदाहरणों में जिस विशिष्ट कार्य का उपयोग किया है, वह हमारी चर्चा के उद्देश्यों के लिए इतना महत्वपूर्ण नहीं है। मेरा मुद्दा विभिन्न अनुकूलन रणनीतियों की व्याख्या करना था जो SQL सर्वर विभिन्न उपकरणों के साथ नियोजित करता है।

जब आप कर लें, तो सफाई के लिए निम्न कोड का उपयोग करें:

DROP INDEX IF EXISTS idx_nc_cid_odD_oidD_i_eid ON Sales.Orders;

सारांश और आगे क्या है

तो, हमने इससे क्या सीखा?

एक iTVF एक पुन:प्रयोज्य पैरामीटरयुक्त नामित तालिका व्यंजक है।

SQL सर्वर डिफ़ॉल्ट रूप से iTVFs के साथ एक पैरामीटर एम्बेडिंग ऑप्टिमाइज़ेशन रणनीति का उपयोग करता है, और संग्रहीत प्रक्रिया प्रश्नों के साथ एक पैरामीटरयुक्त क्वेरी ऑप्टिमाइज़ेशन रणनीति का उपयोग करता है। संग्रहीत कार्यविधि क्वेरी में OPTION(RECOMPILE) जोड़ने से पैरामीटर एम्बेडिंग ऑप्टिमाइज़ेशन हो सकता है।

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

iTVF प्रश्नों के लिए योजनाएं कैश की जाती हैं और उनका पुन:उपयोग किया जा सकता है, जब तक कि समान पैरामीटर मान दोहराए जाते हैं।

आप आईटीवीएफ को इनपुट के रूप में बाएं टेबल से कॉलम पास करते हुए, बाएं टेबल से प्रत्येक पंक्ति में आईटीवीएफ लागू करने के लिए एप्लाई ऑपरेटर और आईटीवीएफ के उपयोग को आसानी से जोड़ सकते हैं।

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


No

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटा फ़ाइलों को स्टेटिस्टिका के साथ मर्ज करना, भाग 1

  2. मर्ज के साथ सॉर्ट करने से बचना Concatenation में शामिल हों

  3. Azure SQL डेटाबेस के लिए बैंडविड्थ के अनुकूल क्वेरी प्रोफाइलिंग

  4. पूर्वावलोकन :Azure Data Studio के लिए SentryOne Plan Explorer एक्सटेंशन

  5. SQL VARCHAR डेटा प्रकार तेज़ डेटाबेस के लिए क्या करें और क्या न करें