मैंने हाल ही में 5.0 का उपयोग करके एक डीबीकॉन्टेक्स्ट में 4.1 का उपयोग करके ऑब्जेक्ट कॉन्टेक्स्ट से ऑब्जेक्ट कॉन्टेक्स्ट से अपना इकाई मॉडल ले जाया। मुझे ऐसा करने में खेद हो रहा है क्योंकि मैं DbContext बनाम ऑब्जेक्ट कॉन्टेक्स्ट का उपयोग कर क्वेरी पर कुछ बहुत खराब प्रदर्शन देख रहा हूं। यहां परीक्षण परिदृश्य है:डीबीकॉन्टेक्स्ट क्वेरी प्रदर्शन खराब बनाम ऑब्जेक्ट कॉन्टेक्स्ट
दोनों संदर्भ समान डेटाबेस का उपयोग लगभग 600 तालिकाओं के साथ करते हैं। LazyLoading और ProxyCreation दोनों के लिए बंद है (कोड उदाहरण में दिखाया नहीं गया है)। दोनों में पूर्व-उत्पन्न विचार हैं।
परीक्षण पहले मेटाडेटा वर्कस्पेस को लोड करने के लिए 1 कॉल बनाता है। फिर एक लूप में जो 100 बार निष्पादित हो जाता है, मैं एक संदर्भ को नया करता हूं और पहला कॉल करता हूं जो पहले 10 लेता है। (मैं लूप के अंदर संदर्भ बना रहा हूं क्योंकि यह डब्लूसीएफ सेवा में इस्तेमाल किया जा रहा है, जो बनाता है संदर्भ हर बार)
for (int i = 0; i < 100; i++)
{
using (MyEntities db = new MyEntities())
{
var a = db.MyObject.Take(10).ToList();
}
}
जब मैं ऑब्जेक्ट कॉन्टेक्स्ट के साथ इसे चलाता हूं तो इसमें लगभग 4.5 सेकंड लगते हैं। जब मैं इसे डीबीकॉन्टेक्स्ट का उपयोग करके चलाता हूं तो इसमें लगभग 17 सेकंड लगते हैं। मैंने RedGate के प्रदर्शन प्रोफाइलर का उपयोग करके इसका प्रोफाइल किया। डीबीकॉन्टेक्स्ट के लिए ऐसा लगता है कि प्रमुख अपराधी UpdateEntitySetMappings नामक एक विधि है। इसे प्रत्येक क्वेरी पर कहा जाता है और ओएसपेस में प्रत्येक आइटम के माध्यम से मेटाडेटार्कस्पेस और चक्र को पुनर्प्राप्त करने लगता है। AsNoTracking मदद नहीं की थी।
संपादित करें: कुछ बेहतर विवरण देने के लिए, समस्या को एक ऑब्जेक्टसेट बनाम डीबीसेट के निर्माण \ प्रारंभिकरण के साथ करना है, वास्तविक क्वेरी नहीं। जब मैं ऑब्जेक्ट कॉन्टेक्स्ट के साथ कॉल करता हूं, ऑब्जेक्टसेट बनाने के लिए औसत 42ms लगते हैं। जब मैं डीबीकॉन्टेक्स्ट के साथ कॉल करता हूं, तो आंतरिक dbset बनाने में लगभग 140ms लगते हैं। ऑब्जेक्टसेट और डीबीसेट दोनों मेटाडेटावाक्स्पेस से कुछ एंसेटसेट मैपिंग लुकअप करते हैं। मैंने जो देखा है वह यह है कि ऑब्जेक्टसेट नहीं करता है, जबकि डीबीसेट यह कार्यक्षेत्र में सभी प्रकार के लिए करता है। मैं अनुमान लगा रहा हूं (कोशिश नहीं की है) कि कम तालिका वाले मॉडल जो प्रदर्शन अंतर कम है।