तो आपका सी # कोड किस विधि का उपयोग कर SQL सर्वर पर एक विज्ञापन SQL क्वेरी भेज रहा है? क्या आपने संग्रहीत प्रक्रिया का उपयोग करने पर विचार किया है? यह शायद वही प्रदर्शन सुनिश्चित करेगा (कम से कम इंजन में) चाहे इसे किसने बुलाया हो।
क्यों? ARITHABORT सेटिंग उन चीजों में से एक है जिसे ऑप्टिमाइज़र देखता है जब यह निर्धारित करता है कि आपकी क्वेरी को कैसे निष्पादित किया जाए (अधिक विशेष रूप से, योजना मिलान के लिए)। यह संभव है कि कैश में योजना की SSMS जैसी ही सेटिंग हो, इसलिए यह कैश्ड योजना का उपयोग करती है, लेकिन विपरीत सेटिंग के साथ आपका C# कोड एक पुनर्संकलन को मजबूर कर रहा है (या शायद आप वास्तव में BAD मार रहे हैं) कैश में योजना), जो निश्चित रूप से कई मामलों में प्रदर्शन को नुकसान पहुंचा सकता है।
यदि आप पहले से ही एक संग्रहीत कार्यविधि को कॉल कर रहे हैं (आपने अपनी क्वेरी पोस्ट नहीं की, हालांकि मुझे लगता है कि आपका मतलब था), तो आप संग्रहीत कार्यविधि में आपत्तिजनक क्वेरी (या प्रश्नों) में विकल्प (RECOMPILE) जोड़ने का प्रयास कर सकते हैं। इसका मतलब यह होगा कि वे बयान हमेशा पुन:संकलित होंगे, लेकिन यह उस खराब योजना के उपयोग को रोक सकता है जिसे आप मार रहे हैं। एक अन्य विकल्प यह सुनिश्चित करना है कि जब संग्रहित प्रक्रिया को संकलित किया जाता है, तो बैच को SET ARITHABORT ON के साथ निष्पादित किया जाता है।
अंत में, आप पूछ रहे हैं कि आप SSMS में ARITHABORT सेटिंग कैसे बदल सकते हैं। मुझे लगता है कि आप जो पूछना चाहते थे वह यह है कि आप अपने कोड में ARITHABORT सेटिंग को कैसे लागू कर सकते हैं। यदि आप अपने C# ऐप से तदर्थ SQL भेजना जारी रखने का निर्णय लेते हैं, तो निश्चित रूप से आप एक कमांड को टेक्स्ट के रूप में भेज सकते हैं जिसमें सेमी-कॉलन द्वारा अलग किए गए कई स्टेटमेंट हैं, जैसे:
SET ARITHABORT ON; SELECT ...
यह समस्या क्यों होती है, इस बारे में अधिक जानकारी के लिए, एरलैंड सोमरस्कोग का महान लेख देखें:
- आवेदन में धीमा, एसएसएमएस में तेज? प्रदर्शन रहस्यों को समझना