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

निष्पादन योजनाओं में पंक्ति लक्ष्य निर्धारित करना और उनकी पहचान करना

परिचय

SQL सर्वर उत्पाद दस्तावेज़ीकरण पंक्ति लक्ष्यों . के विषय पर थोड़ा हल्का है . मुख्य आधिकारिक संदर्भ इस प्रकार हैं:

  • संकेत (ट्रांजैक्ट-एसक्यूएल) - क्वेरी (FAST और DISABLE_OPTIMIZER_ROWGOAL संकेत)
  • DBCC TRACEON - ट्रेस फ़्लैग्स (Transact-SQL) (ट्रेस फ़्लैग 4138)
  • यदि क्वेरी अनुकूलक शीर्ष ऑपरेटर (KB 2667211) का उपयोग करता है, तो क्वेरी को चलने में लंबा समय लग सकता है

जब लोग उसमें निहित से अधिक जानकारी मांगते हैं, तो मैं आमतौर पर उन्हें निम्नलिखित में से एक या अधिक का उल्लेख करता हूं:

  • एसक्यूएल सर्वर क्वेरी ऑप्टिमाइज़ेशन टीम द्वारा कार्रवाई में पंक्ति लक्ष्य
  • पंक्ति लक्ष्यों पर दोबारा गौर किया गया - SQL सर्वर क्वेरी ऑप्टिमाइज़ेशन टीम द्वारा भी तेज़ संकेत मार्गदर्शन
  • बार्ट डंकन द्वारा रो गोल गॉन रॉग
  • ऑप्टिमाइज़र के अंदर:मेरे द्वारा गहराई में लक्ष्य पंक्तिबद्ध करें
  • एसएसआईएस ट्यूनिंग टिप जिसे रॉब फ़ार्ले हर कोई याद करता है

संक्षेप में सारांशित करने के लिए:पंक्ति लक्ष्य सुविधा अनुकूलक को एक निश्चित संख्या में पंक्तियों को जल्दी से वापस करने के उद्देश्य से एक निष्पादन योजना (या निष्पादन योजना का भाग) उत्पन्न करने की अनुमति देती है। यह सामान्य व्यवहार (एक पंक्ति लक्ष्य के बिना) के विपरीत है, जिसका उद्देश्य संपूर्ण संभावित परिणाम सेट के लिए अनुकूलित योजना खोजना है।

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

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

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

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

पंक्ति लक्ष्य निर्धारित करना

पंक्ति लक्ष्य प्रभावों की तलाश करना बहुत आसान है यदि कोई जानता है कि किस प्रकार की चीजें पहले स्थान पर पंक्ति लक्ष्य निर्धारित कर सकती हैं। आधिकारिक दस्तावेज अक्सर पंक्ति लक्ष्यों के बारे में TOP . कीवर्ड से जुड़े होने की बात करते हैं , FAST , IN , और EXISTS . यह पाठक को अधूरी या भ्रामक समझ के साथ छोड़ सकता है, इसलिए कुछ पहलुओं को स्पष्ट करने के लिए कुछ समय देना उचित है।

मैं सीधे इस बात पर जोर देना चाहता हूं कि विशिष्ट T-SQL कीवर्ड का उपयोग करके एक प्रश्न में गारंटी नहीं देता है कि एक पंक्ति लक्ष्य निर्धारित किया जाएगा . आधिकारिक दस्तावेज़ में कुछ कीवर्ड का उल्लेख किया गया है ताकि लोगों को उन सामान्य परिदृश्यों की पहचान करने में मदद मिल सके जहां पंक्ति लक्ष्य हो सकता है बहुत अधिक तकनीकीताओं में शामिल हुए बिना पेश किया जा सकता है।

ध्यान में रखने वाली दूसरी सामान्य बात यह है कि एक पंक्ति लक्ष्य केवल तभी निर्धारित किया जाता है जब लक्ष्य नियमित अनुमान से कम हो . आखिरकार, 100 पंक्तियों के लिए अनुकूलित एक योजना खंड उत्पन्न करने का कोई मतलब नहीं है यदि पूरी चीज केवल 50 पंक्तियों का उत्पादन करने की उम्मीद है। अधिक स्पष्ट होने के लिए, यह बिंदु हमेशा उन सभी तरीकों पर लागू होता है जिनमें एक पंक्ति लक्ष्य निर्धारित किया जा सकता है। यदि आप एक पंक्ति लक्ष्य की अपेक्षा कर रहे हैं, लेकिन एक नहीं देख पा रहे हैं, तो यह एक संभावित कारण है।

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

आइए अब उन चीजों को देखें जो एक पंक्ति लक्ष्य निर्धारित कर सकती हैं:

फास्ट और टॉप

FAST का उपयोग करना क्वेरी संकेत रूट . पर एक पंक्ति लक्ष्य निर्धारित करने का एक विश्वसनीय तरीका है निष्पादन योजना का (ऊपर उल्लिखित सामान्य अपवादों के अधीन)। ए SET ROWCOUNT n कथन एक समान शीर्ष-स्तरीय पंक्ति लक्ष्य भी निर्धारित करता है (जब n निश्चित रूप से शून्य नहीं है) उन कथनों के लिए जिन पर यह लागू होता है।

एक TOP लिखना एक क्वेरी में क्लॉज भी अक्सर एक पंक्ति लक्ष्य में परिणत होता है। जब तक तैयार निष्पादन योजना में एक भौतिक शीर्ष ऑपरेटर होता है, यह संभावना है कि शीर्ष ऑपरेटर के नीचे की योजना का कम से कम एक हिस्सा एक पंक्ति लक्ष्य से प्रभावित था (फिर से, सामान्य नियम और शर्तें लागू होती हैं)।

ध्यान दें कि शीर्ष ऑपरेटरों क्वेरी अनुकूलक द्वारा प्रस्तुत (बिना किसी क्वेरी-निर्दिष्ट TOP . के खंड) एक पंक्ति लक्ष्य भी निर्धारित कर सकता है। यह महत्वपूर्ण है, क्योंकि ऐसा होने के सभी तरीके हैं, उदाहरण के लिए एक साधारण पंक्ति संख्या पर फ़िल्टर करते समय, जैसा कि निम्नलिखित AdventureWorks क्वेरी में दिखाया गया है:

SELECT
    THN.RowNum,
    THN.TransactionID 
FROM 
(
    SELECT 
        TH.TransactionID, 
        RowNum = 
            ROW_NUMBER() OVER (
                ORDER BY TH.TransactionID ASC)
    FROM Production.TransactionHistory AS TH
    WHERE
        TH.ProductID = 400
) AS THN
WHERE
    THN.RowNum >= 10
    AND THN.RowNum < 20
ORDER BY
    THN.RowNum ASC;

उस क्वेरी के लिए निष्पादन योजना में ऑप्टिमाइज़र द्वारा जोड़ा गया एक शीर्ष ऑपरेटर शामिल है (प्रसंस्कृत पंक्तियों की संख्या को 20 तक सीमित करने के लिए):