अभी मैं एक सुंदर जटिल डेटाबेस पर काम कर रहा हूं। हमारा ऑब्जेक्ट मॉडल डेटाबेस में मैप किए जाने के लिए डिज़ाइन किया गया है। हम मैन्युअल रूप से जेनरेट किए गए पीओसीओ कक्षाओं के साथ ईएफ 5 का उपयोग कर रहे हैं।इकाई फ्रेमवर्क 5 प्रदर्शन चिंताओं
सबकुछ काम कर रहा है, लेकिन प्रदर्शन के बारे में कुछ शिकायत है। मैंने कभी ईएफ के साथ प्रदर्शन की समस्या नहीं की है, इसलिए मैं सोच रहा हूं कि इस बार मैंने कुछ गलत किया है, या समस्या कहीं और रह सकती है।
मुख्य क्वेरी गतिशील पैरामीटर से बना हो सकती है।
if (parameter != null) { query = query.Where(c => c.Field == parameter); }
इसके अलावा, कुछ जटिल और/या संयोजन मैं Albahari से LinqKit एक्सटेंशन का उपयोग कर रहा हूँ के लिए: मैं कई अगर और स्विच ब्लॉकों है कि इस तरह धारणात्मक हैं।
क्वेरी "ऑर्डर" की एक बड़ी तालिका के खिलाफ है, जिसमें वर्षों और वर्षों के डेटा शामिल हैं। हालांकि औसत उपयोग एक 2 महीने रेंज फिल्टर है।
अब जब मुख्य क्वेरी तैयार की जाती है, तो इसे Skip/Take
संयोजन के साथ अंकनित किया जाता है, जहां टेक 10 तत्वों पर सेट होता है।
इसके बाद, IQueryable परतों के माध्यम से भेजा जाता है, एमवीसी परत तक पहुंचता है जहां ऑटोमैपर नियोजित होता है।
यहां, जब ऑटोमैपर फिर से शुरू होता है (और इस प्रकार क्वेरी वास्तव में निष्पादित होती है) यह नेविगेशन गुणों का एक गुच्छा कहती है, जिसमें उनके स्वयं के नेविगेशन गुण होते हैं और इसी तरह। अगर आपके पास 3 या 4 से अधिक विशिष्ट इकाइयों को शामिल करने के लिए उत्सुक लोडिंग से बचने के लिए ईएफ सिफारिशों के अनुसार सब कुछ आलसी हो रहा है। (10 अधिकतम) आदेश
- इनमें से कुछ उनके अधीन अन्य नेविगेशन (स्थानीयकरण संस्थाओं)
- कई नेविगेशन गुण
- आदेश: मेरी परिदृश्य कुछ इस तरह है विवरण (प्रति ऑर्डर के कई ऑर्डर विवरण)
- प्रत्येक ऑर्डर विवरण के तहत कई नेविगेशन गुण
- इनमें से कुछ उनके अधीन अन्य नेविगेशन (स्थानीयकरण संस्थाओं) है
- प्रत्येक ऑर्डर विवरण के तहत कई नेविगेशन गुण
- आदेश: मेरी परिदृश्य कुछ इस तरह है विवरण (प्रति ऑर्डर के कई ऑर्डर विवरण)
यह आसानी से एक भी प्रदान की गई "पृष्ठ" के लिए 300+ प्रश्नों की कुल की ओर जाता है। उन प्रश्नों में से प्रत्येक बहुत तेजी से होता है, कुछ मिलीसेकेंड में चल रहा है, लेकिन अभी भी वहाँ 2 मुख्य चिंताएं हैं: इस प्रकार अधिक समय
- आलसी लोड गुण अनुक्रम में कहा जाता है और नहीं parallelized पिछले बिंदु के, प्रत्येक क्वेरी के बीच कुछ मृत समय है, क्योंकि डेटाबेस को एसक्यूएल प्राप्त करना है, इसे चलाएं, इसे वापस करें और प्रत्येक क्वेरी के लिए इसे वापस करें।
बस देखने के लिए कि यह कैसे चला गया, मैं उत्सुक लोड हो रहा है के साथ एक ही क्वेरी करने की कोशिश की है, और जैसा कि मैंने भविष्यवाणी की यह एक से अधिक 7K लाइनों (हाँ, सात हजारों) और के एक अनुवाद एसक्यूएल के साथ एक कुल आपदा थी, समग्र रूप से अधिक धीमी गति से।
अब मुझे लगता है कि इस परिदृश्य के लिए ईएफ और लिंक सही विकल्प नहीं हैं। कुछ लोग कह रहे हैं कि यदि वे एक संग्रहीत प्रक्रिया लिखना चाहते थे जो सभी आवश्यक डेटा प्राप्त करता है, तो यह कई गुना तेजी से चलता है। मुझे विश्वास नहीं है कि यह सच है, और हम सभी संबंधित इकाइयों के स्वचालित भौतिककरण को खो देंगे।
मैं कुछ चीजें मैं जैसे, सुधार करने के लिए कर सकता है के बारे में सोचा:,
- टेबल बंटवारे चयनित स्तंभों
- वस्तु पर नज़र रखने को बंद कर दें कम करने के लिए के रूप में इस परिदृश्य केवल पढ़ने के लिए (ट्रैक न किए गए इकाइयां)
इन सभी के साथ, मुख्य शिकायत यह है कि परिणाम पृष्ठ (एमवीसी 4 में किया गया) बहुत धीरे-धीरे प्रस्तुत करता है, और कुछ निदान के बाद यह सभी "सर्वर समय" और "नेटवर्क टाइम" नहीं लगता है सर्वर समय के 8 से 12 सेकंड के बारे में।
मेरे अनुभव से, यह हो रहा नहीं किया जाना चाहिए। मैं अगर मैं एक गलत तरीके से इस प्रश्न की जरूरत आ रहा हूँ सोच रहा हूँ, या अगर मैं कुछ और (शायद एक बुरा कॉन्फ़िगर किया गया आईआईएस सर्वर, वरना मैं सच में पता कर रहा हूँ कुछ भी) के लिए मेरा ध्यान बारी करने के लिए है। कहने के लिए सुई, डेटाबेस के सूचकांक ठीक है, हमारे डीबीए द्वारा बहुत सावधानी से जांच की।
किसी को भी किसी भी टिप, सलाह, सबसे अच्छा अभ्यास मैं इस बारे में याद कर रहा हूँ, या बस मुझे इस स्थिति के लिए लेज़ी लोड हो रहा है साथ एफई का उपयोग करने में बता सकता है कि मैं मर गलत हूँ है तो अगर ... आप सभी का स्वागत करते हैं ।
एफडब्ल्यूआईडब्ल्यू, मैं अपने स्वयं के ओआरएम को वर्षों से (ईएफ अस्तित्व से पहले) बनाए रख रहा हूं (काफी खुशी से)। मैंने पाया है कि जटिल भार शामिल होने पर स्वचालन टूटना शुरू हो जाता है। मैं आमतौर पर एक जटिल ऑब्जेक्ट पेड़ के लिए आवश्यक डेटा प्राप्त करने के लिए एक संग्रहित प्रक्रिया लिखता हूं, और उसके बाद इसे उन मददगारों के पास भेजता हूं जो तत्काल/मानचित्रण को स्वचालित करते हैं। इसमें कोड का एक बड़ा सौदा शामिल नहीं है और - ठीक से किया गया - यह बहुत तेज़ होगा। यहां तक कि यदि आपके 300 कॉल जल्दी से निष्पादित होते हैं, तो क्या आप वास्तव में 300 कॉल चाहते हैं जब 1 करेगा? मुझे तेजी से नेटवर्क पर एक चतुर रिश्ते के साथ कोई समस्या नहीं है, लेकिन यह अत्यधिक है। –
तो मुझे लौटाई गई एसक्यूएल से प्रत्येक इकाई को मूर्त रूप देने के लिए कोड को मैन्युअल रूप से संयोजित करना होगा। इस डेटाबेस की इकाइयां/सारणी 100 के आसपास हैं। क्या आप वाकई यह एक सुविधाजनक समाधान होगा? क्योंकि यह मुझे नहीं लगता है। –
मैं कोड प्रोफाइलिंग और सटीक हॉटस्पॉट की पहचान करने का सुझाव दूंगा। आप कहते हैं कि यह "सर्वर समय" है; एक प्रोफाइलर संलग्न करें (उदा। वीएस में से एक) और पता लगाएं कि यह समय कहां खर्च कर रहा है। और हां, संग्रहित प्रक्रिया को बनाए रखना जो दर्जनों टेबल लौटाता है चुनौतीपूर्ण हो सकता है (हालांकि स्कीमा नहीं बदले तो वह बुरा नहीं है)। मुझे उम्मीद है कि भौतिकरण अभी भी कुछ हद तक स्वचालित हो सकता है (सुनिश्चित नहीं है कि ईएफ में स्वचालित लोड के साथ मैन्युअल कॉल मिश्रण करने के लिए क्या क्षमताएं हैं)। –