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

अत्यंत धीमी EF स्टार्टअप - 15 मिनट

मैं उन तरकीबों से EF के कारण कुल प्रारंभ समय को 3 गुना कम करने में कामयाब रहा:

  1. फ्रेमवर्क को 6.2 में अपडेट करें और मॉडल कैशिंग को सक्षम करें। :

    पब्लिक क्लास कैशिंग कॉन्टेक्स्ट कॉन्फ़िगरेशन:डीबी कॉन्फ़िगरेशन {सार्वजनिक कैशिंग कॉन्टेक्स्ट कॉन्फ़िगरेशन () {सेटमोडेलस्टोर (नया डिफॉल्ट डीबीमोडेलस्टोर (डायरेक्टरी। गेटकुरेंट डायरेक्टरी ()));}

    }

  2. ctx.Database.Initialize() . पर कॉल करें स्पष्ट रूप से जितनी जल्दी हो सके नए धागे से। इसमें अभी भी 3-4 सेकंड लगते हैं, लेकिन चूंकि यह अन्य चीजों के साथ होता है, इसलिए यह बहुत मदद करता है।

  3. इकाइयों को EF कैश में उचित क्रम में लोड करें।

पहले, मैंने अभी-अभी शामिल करें के बाद Inlude लिखा था, जो कई जॉइन में तब्दील हो जाता है। मुझे कुछ ब्लॉग पोस्टों पर "अंगूठे का नियम" मिला, जिसमें दो जंजीर शामिल हैं, ईएफ बेहतर प्रदर्शन करता है, लेकिन प्रत्येक और सब कुछ बड़े पैमाने पर धीमा कर देता है। मुझे एक ब्लॉग पोस्ट भी मिली , जिसने ईएफ कैशिंग दिखाया:एक बार दी गई इकाई को शामिल या लोड के साथ लोड किया गया था, यह स्वचालित रूप से उचित संपत्ति में डाल दिया जाएगा (ब्लॉग लेखक वस्तुओं के संघ के बारे में गलत है)। तो मैंने यह किया:

  using (var db = new MyContext())
            {
                db.Fields.Load();
                db.Categories.Include(c => c.MainField).Include(x => x.Fields).Load();
                db.FieldValues.Load();
                return db.Objects.Include(x => x.MainFieldValue.Field).ToArray();
            } 

यह प्रश्न से शामिल डेटा की तुलना में 6 गुना तेजी से डेटा प्राप्त कर रहा है। मुझे लगता है कि एक बार इकाइयां पहले लोड हो जाने के बाद, ईएफ इंजन संबंधित वस्तुओं के लिए डेटाबेस को कॉल नहीं करता है, यह सिर्फ उन्हें कैश से प्राप्त करता है।

  1. मैंने इसे अपने संदर्भ निर्माता में भी जोड़ा:

        Configuration.LazyLoadingEnabled = false;
        Configuration.ProxyCreationEnabled = false;
    

इसके प्रभाव मुश्किल से ध्यान देने योग्य हैं, लेकिन विशाल डेटा सेट पर बड़ी भूमिका निभा सकते हैं।

मैंने यह भी देखा है रोवन मिलर द्वारा ईएफ कोर की प्रस्तुति और मैं इसे अगली रिलीज पर बदल दूंगा - कुछ मामलों में यह ईएफ 6 से 5-6 गुना तेज है।

आशा है कि यह किसी की मदद करेगा




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में डेटाबेस सेटिंग्स वापस करने के लिए DATABASEPROPERTYEX () का उपयोग करें

  2. EXISTS बनाम जॉइन और EXISTS क्लॉज का उपयोग

  3. जांचें कि क्या फ़ील्ड संख्यात्मक है, फिर केवल उन फ़ील्ड पर एक कथन में तुलना निष्पादित करें?

  4. बेहतर गतिशील SQL से बचने के लिए 10 SP_EXECUTESQL गोचास

  5. SqlGeographyBuilder का उपयोग करते समय 'निर्दिष्ट इनपुट एक वैध भूगोल उदाहरण का प्रतिनिधित्व नहीं करता है' अपवाद