मैं तुम्हें पेशेवरों/निम्नलिखित के साथ गुरुओं से पुष्टि/स्पष्टीकरण की जरूरत है क्योंकि मेरी टीम ने मुझे कह रहा है "यह कोई बात नहीं" और यह मेरे :)SQL प्रदर्शन, नेट अनुकूलन बनाम उत्तम आचरण
पृष्ठभूमि fustrating है : हमारे पास एक SQL Server 2008 है जिसका उपयोग हमारे मुख्य MVC3/.Net4 वेब ऐप द्वारा किया जा रहा है। हमारे पास किसी दिए गए बिंदु पर लगभग 200+ समवर्ती उपयोगकर्ता हैं। सर्वर को बहुत मुश्किल से मारा जा रहा है (ताले, टाइमआउट, समग्र धीमेपन) और मैं अपने पूरे करियर में और मेरे आखिरी एमएस प्रमाणन वर्ग में जो कुछ सीखा, उसे लागू करने की कोशिश कर रहा हूं। वे चीजें हैं जिन पर हम सभी को ड्रिल किया गया है ("एसक्यूएल एसक्यूएल कनेक्शन स्टेटस") और मैं अपनी टीम को यह बताने की कोशिश कर रहा हूं कि इन 'छोटी चीजें ", हालांकि अकेले अकेले कोई फर्क नहीं पड़ता है, अंत में जोड़ता है।
मुझे पता है कि अगर निम्न एक प्रदर्शन प्रभाव है की जरूरत है या यह सिर्फ 'सबसे अच्छा अभ्यास'
1. का उपयोग करके कीवर्ड "का उपयोग" अगर उनके कोड के अधिकांश इस तरह है:।
public string SomeMethod(string x, string y) {
SomethingDataContext dc = new SomethingDataContext();
var x = dc.StoredProcedure(x, y);
}
जबकि मैं उन्हें यह बताने की कोशिश कर रहा हूं कि संसाधनों को तेजी से बंद/मुक्त कर देता है:
using (SomethingDataContext dc = new SomethingDataContext()) {
var x = dc.StoredProcedure(x, y);
}
उनका तर्क यह है कि जीसी कोड निष्पादित करने के बाद पर्याप्त नौकरी की सफाई करता है, इसलिए इसका उपयोग बहुत बड़ा असर नहीं पड़ता है। सच या गलत और क्यों?
2. कनेक्शन ताल
मैं हमेशा कनेक्शन पूल की स्थापना काफी किसी भी वेबसाइट (कम से कम नेट डब्ल्यू/MSSQL) में तेजी लाने के कर सकते हैं के बारे में सुना। मैं हम web.config में हमारे ConnectionStrings के लिए निम्न जोड़ने की सिफारिश की:
... "पूलिंग = सच; मिन पूल आकार = 3; अधिकतम पूल आकार = 100; कनेक्शन समय समाप्त = 10,"। ..
उनका तर्क यह है कि .NET/MSSQL दृश्यों के पीछे कनेक्शन पूल सेट कर चुका है और हमारे web.config में रखना आवश्यक नहीं है। सही या गलत? क्यों हर दूसरी साइट का कहना है कि पूलिंग को इष्टतम प्रदर्शन के लिए जोड़ा जाना चाहिए यदि यह पहले से ही सेटअप हो रहा है?
3. कम से कम कॉल की #
डीबी भूमिका/सदस्यता प्रदाता कि डिफ़ॉल्ट नेट MVC परियोजना अच्छा है के साथ आता है - यह आसान है और आप के लिए शेष काम के सबसे करता है। लेकिन ये लोग UsersInRoles()
का गंभीर उपयोग कर रहे हैं और इसे वैश्विक चर की तरह स्वतंत्र रूप से उपयोग करते हैं (यह हर बार इस विधि को डीबी हिट करता है)। मैंने एक "उपयोगकर्ता ऑब्जेक्ट" बनाया है जो प्रत्येक पगेलोड (कुछ अन्य उपयोगकर्ता सामग्री, जैसे कि GUID, आदि) के साथ सभी भूमिकाओं को आगे बढ़ाता है और फिर उपयोगकर्ता के पास भूमिका के लिए इस ऑब्जेक्ट से पूछताछ करता है।
वेबसाइट के अन्य हिस्सों में बयान के लिए 200 गुना अधिक लूप है और प्रत्येक पास = 4,000 डेटाबेस कॉल से 20-30 वर्ग प्रश्न पूछता है। यह किसी भी तरह से सेकंड के मामले में करता है, लेकिन मैं जो करना चाहता हूं वह 20-30 डीबी कॉल को एक में समेकित करता है, ताकि यह 200 बार कॉल (प्रत्येक लूप) को कॉल कर सके। लेकिन चूंकि एसक्यूएल प्रोफाइलर का कहना है कि क्वेरी ने "0 सेकंड" लिया, तो वे तर्क दे रहे हैं कि यह इतना तेज और छोटा है कि सर्वर इन उच्च संख्या में डीबी प्रश्नों को संभाल सकते हैं।
मेरी सोच है "हाँ, ये प्रश्न तेजी से चल रहे हैं, लेकिन वे समग्र SQL सर्वर के प्रदर्शन को मार रहे हैं।" क्या यह एक योगदान कारक हो सकता है? क्या मैं कुछ भी करने की चिंता नहीं कर रहा हूं, या यह सर्वर के समग्र प्रदर्शन मुद्दों के लिए एक महत्वपूर्ण (महत्वपूर्ण) योगदान कारक है?
4. अन्य कोड अनुकूलन
पहले एक जो मन में आता StringBuilder
बनाम एक सरल स्ट्रिंग चर का उपयोग कर रहा है। मैं समझता हूं कि मुझे StringBuilder
(विशेष रूप से लूप में) का उपयोग क्यों करना चाहिए, लेकिन वे कहते हैं कि इससे कोई फर्क नहीं पड़ता - भले ही उन्हें 10k + लाइनें लिखने की आवश्यकता हो, उनका तर्क यह है कि प्रदर्शन लाभ कोई फर्क नहीं पड़ता।
तो सब कुछ हम सब कुछ सीखते हैं और हमें ड्रिल करते हैं ("स्कोप को कम करें!") वास्तविक प्रदर्शन लाभ के साथ बस 'सर्वोत्तम अभ्यास' या वे सभी वास्तविक/मापनीय प्रदर्शन में योगदान करते हैं नुकसान?
संपादित *** अपने सभी सवालों के जवाब के लिए धन्यवाद लोग! मेरे पास आपके उत्तरों के आधार पर एक नया (5 वां) प्रश्न है: वास्तव में वे "उपयोग" का उपयोग नहीं करते हैं, तो इसका क्या अर्थ हो रहा है? यदि कनेक्शन पूलिंग स्वचालित रूप से हो रही है, तो क्या यह पूल से कनेक्शन को तब तक जोड़ रहा है जब तक कि जीसी न आए? क्या यह संभव है कि SQL सर्वर के लिए प्रत्येक खुले कनेक्शन सर्वर पर थोड़ा अधिक बोझ जोड़ रहा है और इसे धीमा कर रहा है?
आपके सुझावों के आधार पर, मैं कनेक्शन समय के कुछ गंभीर बेंचमार्किंग/लॉगिंग करने की योजना बना रहा हूं क्योंकि मुझे संदेह है कि ए) सर्वर धीमा है, बी) वे कनेक्शन बंद नहीं कर रहे हैं और सी) प्रोफाइलर कह रहा है कि यह 0 में चला गया सेकंड, कनेक्शन से धीमा हो सकता है।
मैं वास्तव में आपकी सहायता लोगों की सराहना करता हूं। एक बार फिर धन्यवाद
यह नहीं कहना है कि शोध महत्वपूर्ण नहीं है लेकिन एसओ पर गुरु बहुत अंतर्दृष्टि प्रदान करते हैं ... वे जो कहते हैं उसका अध्ययन करना बहुत अधिक शोध है –
@ जेक विल्सन 801 एमएस से दस्तावेज़ीकरण हमेशा सबसे अच्छा स्रोत नहीं है। (संपादित करें: या यहां तक कि एक अच्छा स्रोत) –
स्ट्रिंग बिल्डर के बजाय स्ट्रिंग बिल्डर का उपयोग कर दो - यदि आप एक बार तारों को जोड़ रहे हैं (यानी 'var s = "a" + "b" '), तो एक स्ट्रिंग अधिक कुशल होगी, क्या आपको याद रखना होगा कि एक स्ट्रिंग इंस्टेंस म्यूटेबल नहीं है, इसलिए लूप में 'स्ट्रिंग एस =" ए "; के लिए (int i = 1, i <1000; i ++) {s + = "a";} 'आप प्रत्येक लूप के लिए एक नया स्ट्रिंग उदाहरण बनाते हैं, यह स्मृति आवंटन को प्रभावित करेगा और समग्र प्रदर्शन को प्रभावित करेगा (चाहे वह महत्वपूर्ण है या नहीं concatenations की संख्या पर निर्भर करेगा)। – GarethD