टी-एसक्यूएल में आईएफ का उपयोग करने से निष्पादन योजना कैशिंग कमजोर या टूट जाती है?


20

यह मुझे सुझाव दिया गया है कि टी-एसक्यूएल बैचों में आईएफ बयानों का उपयोग प्रदर्शन के लिए हानिकारक है। मैं कुछ पुष्टि खोजने या इस दावे को मान्य करने का प्रयास कर रहा हूं। मैं SQL Server 2005 और 2008 का उपयोग कर रहा हूं।

यह कथन निम्नलिखित बैच के साथ है: -

IF @parameter = 0
 BEGIN
  SELECT ... something
 END

ELSE
 BEGIN
  SELECT ... something else
 END

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

इसके अलावा इस मामले में क्या होता है: -

IF EXISTS (SELECT ....)
 BEGIN
  SELECT ... something
 END

ELSE
 BEGIN
  SELECT ... something else
 END

यह पहले से निर्धारित करना संभव नहीं है कि किस शाखा को निष्पादित किया जाएगा?



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

जवाबों:


10

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

मैं प्रत्येक शाखा के लिए SQL को अपनी संग्रहीत प्रक्रिया में रखूँगा, ताकि उत्पन्न योजना उस शाखा के लिए वास्तविक उपयोग के मानकों पर आधारित हो।


6

केवल शॉर्टकट होगा IF 1 = 1

@ पैरामीटर और EXISTS दोनों को अभी भी "सामान्य मामले" ( @parameter = 42कहना) के लिए प्रसंस्करण की आवश्यकता है

यह कहते हुए कि ... वास्तविक क्रियान्वयन योजना क्या कहती है और साथ ही प्रोफाइलर पुनर्संयोजन की घटनाओं को कैप्चर करता है? (मैं जाओ के जवाब के अनुसार अनुमानित योजनाओं को नापसंद करता हूं)


3

अनुमानित निष्पादन योजना को प्रदर्शित करने का प्रयास करें, वास्तविक नहीं। आप देखेंगे कि पहले एक में CONDऑपरेटर होता है।

यह ऑपरेटर कैश्ड निष्पादन योजना में भी शामिल था। आपके उदाहरण में अनुमानित उत्कृष्टता योजना में एक COND ऑपरेटर और 2 SELECT शाखाएं शामिल होंगी और इसलिए यह पूरी तरह से पुन: प्रयोज्य होगी। क्योंकि एक बैच निष्पादित करते समय SQL सर्वर न केवल डीएमएल स्टेटमेंट बल्कि अन्य सभी के साथ-साथ उन्हें योजना से प्राप्त करता है।

आंतरिक रूप से निष्पादन योजना अभिव्यक्ति वृक्ष के समान एक संरचना है।


0

योजनाएं बनाई गई मापदंडों के आधार पर बनाई जाएंगी ताकि वास्तव में मैं कहूं कि नहीं - सशर्त तर्क है जो सामान्य रूप से मापदंडों पर आधारित है प्रदर्शन के लिए हानिकारक नहीं है।

सूचना प्राप्त करने के लिए क्वेरी ऑप्टिमाइज़र के लिए पैरामीटर के पर्याप्त होने का कारण मानकर आपको कई योजनाएँ मिलेंगी।

आप शो निष्पादन योजना पर स्विच करके देख सकते हैं, स्क्रिप्ट चला रहे हैं - योजना में अंतर नोटिस कर सकते हैं। जब आप प्रक्रियाएँ चलाते हैं (मैं यहाँ संग्रहीत प्रक्रियाओं को मान रहा हूँ), तो आप देखेंगे कि पहली बार आम तौर पर जल्दी होता है, दूसरी हिट संग्रहीत योजना का उपयोग करता है। मापदंडों को बदलें और फिर दोहराएं मूल पैरामीटर चलाएं - सिद्धांत रूप में योजना अभी भी कैश में होगी लेकिन यह सर्वर के उपयोग पर निर्भर करता है (कैश टिक - वे हमेशा के लिए नहीं रहते ..) आदि।


0

हो सकता है कि 2005 और 2008 में इसका सुधार किया गया हो, लेकिन 2000 में सशर्त का उपयोग करने से आपके द्वारा वर्णित किए जाने की संभावना अधिक खराब हो जाएगी, यह प्रक्रिया के पहले चरण को सबसे अच्छी तरह से संभालने के लिए एक योजना संकलित करेगा और फिर शर्तों को लागू करने पर भी प्रक्रिया को निष्पादित करने के लिए उस योजना का उपयोग करेगा। बदला हुआ। मेरे अनुभव में यह प्रश्न उत्पन्न हुआ जो घंटों में चलने के लिए मिनटों में चला गया। हालाँकि मैं अब 2008 का उपयोग करता हूं और 2005 का उपयोग कर चुका हूं, मैं इस पर टिप्पणी नहीं कर सकता कि कोडनल्स कैसे काम करते हैं क्योंकि मैं अब उनका उपयोग नहीं करता हूं।


2
2005+ में स्टेटमेंट लेवल रीकॉम्पिलेशन है, इसलिए आपके पास हर समय "एक प्लान प्रति" नहीं है
gbn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.