हाल ही में मेरे पास एक प्रदर्शन ट्यूनिंग अनुभव था और मैं इसे यहां साझा करना चाहता हूं और यह समझने की कोशिश कर रहा हूं कि यह सुधार क्यों हुआ।क्यों एक चर के लिए एक क्वेरी की गिनती असाइन करना सीधे इसे जांचने से बेहतर प्रदर्शन किया?
मेरी एक प्रो में से, मैं कुछ अन्य रिकॉर्ड के अस्तित्व के आधार पर एक डेटा सेट वापस करना चाहता था।
मेरे प्रश्न:
IF (SELECT COUNT(1) FROM ...) > 0
SELECT …
इस क्वेरी के आसपास 5 सेकंड ले रहा था।
मैंने एक बदलाव किया और IF
कथन को एक चर के लिए आउटपुट सौंपा, फिर इसे जांचें।
DECLARE @cnt INT = 0
SELECT @cnt = COUNT(1) FROM …
IF @cnt > 0
SELECT …
इसे चलाने के लिए 1 सेकंड से भी कम समय लगता है।
इसके अलावा मैंने IF EXISTS
भी कोशिश की लेकिन सुधार से पहले एक ही परिणाम मिला (5 सेकंड)।
मैं जानना चाहता हूं कि संकलक इतना अलग क्यों व्यवहार करता है और यदि उसके लिए कोई विशेष उत्तर है।
धन्यवाद
पॉल व्हाइट ने dba.se पर एक बहुत अच्छा जवाब दिया: [अगर EXSTST एम्बेडेड चुनिंदा कथन से अधिक समय ले रहा है] (http://dba.stackexchange.com/questions/126235/if-exists-taking-longer-than- एम्बेडेड-चयन-कथन) इस प्रश्न को डुप्लिकेट के रूप में चिह्नित किया जाना चाहिए, लेकिन उत्तर SO पर नहीं है। –
धन्यवाद @VladimirBaranov उस सवाल को इंगित करने के लिए। बहुत मददगार था लेकिन मैं जानना चाहता हूं कि इसे एक चर को असाइन करने और इसे सीधे कॉल करने के बीच एक अंतर क्यों है। यहां मेरा इरादा 'IF EXISTS' का उपयोग नहीं कर रहा है। – sqluser
सबसे अधिक संभावना अनुकूलक 'IF (चुनें COUNT (1) से ...)> 0' 'अगर EXISTS ...' में परिवर्तित हो जाता है। मैंने सोचा कि पॉल व्हाइट द्वारा जवाब में इसका उल्लेख किया गया था, लेकिन अब मैं इसे वहां नहीं देख रहा हूं। मैंने इसे कहीं और देखा होगा। निष्पादन योजना की जांच करें। यदि अनुकूलक वास्तव में 'IF COUNT> 0' को 'IF EXISTS' में परिवर्तित करता है, तो' EXISTS' के साथ एक पंक्ति लक्ष्य का परिचय आपको प्राप्त होने वाली गैर-इष्टतम निष्पादन योजना की व्याख्या करेगा। –