2009-08-15 12 views
5

जब मैंने अपनी नई परियोजना के लिए एक ओआर/एम (इस समय MySQL के लिए इकाई फ्रेमवर्क) का उपयोग करने का निर्णय लिया, तो मुझे आशा थी कि यह मुझे समय बचाएगा, लेकिन मुझे लगता है कि यह विफल रहा है (दूसरी बार अब)।इकाई फ्रेमवर्क + MySQL - प्रदर्शन इतना भयानक क्यों है?

इस सरल एसक्यूएल क्वेरी

SELECT * FROM POST ORDER BY addedOn DESC LIMIT 0, 50 

यह निष्पादित करता है और मुझे के रूप में एक दूसरे से कम में परिणाम देता है ले लो यह (टेबल 60,000 के बारे में पंक्तियां हैं) होना चाहिए।

यहाँ संस्थाओं क्वेरी करने के लिए बराबर LINQ है कि मैं इस

var q = (from p in db.post 
      orderby p.addedOn descending 
      select p).Take(50); 

    var q1 = q.ToList(); //This is where the query is fetched and timed out 

के लिए लिखा था है लेकिन इस क्वेरी कभी नहीं भी (orderby बिना यह 5 सेकंड चलाने के लिए ले जाता है) का समय समाप्त हमेशा यह निष्पादित करता! मेरा टाइमआउट 12 सेकंड पर सेट है ताकि आप कल्पना कर सकें कि इससे ज्यादा कुछ ले रहा है।

  • ऐसा क्यों हो रहा है?
  • क्या कोई तरीका है कि मैं देख सकता हूं कि वास्तविक SQL क्वेरी क्या है जो इकाई फ्रेमवर्क डीबी को भेज रहा है?
  • क्या मुझे ईएफ + माईएसक्यूएल पर छोड़ देना चाहिए और इसे मानक बनाने के लिए सभी अनंत काल को खोने से पहले मानक एसक्यूएल में जाना चाहिए?

मैं अपने अनुक्रमित अंशांकित किया है, उत्सुक लोड हो रहा है,

कृपया मदद (जो वास्तव में यह orderby खंड के बिना भी असफल बनाता है) के बारे में मैं या किसी खोए हुए के रूप में MySQL के लिए/एम देने के लिए कर रहा हूँ की कोशिश की कारण।

+1

ठीक है, मैंने छोड़ दिया है और EF + MySQL –

उत्तर

4

मेरा पूरा शोध आखिरकार इस निष्कर्ष पर पहुंचा कि आम तौर पर ईएफ प्रदर्शन के लिए खराब है, माईएसक्ल + ईएफ बेहद कमजोर है। ईएफ पर एल 2 एस की एसओ की पसंद एक अच्छी चाल है और अगर मेरे पास MySQL के बजाय एमएस एसक्यूएल डेटाबेस तक पहुंच थी तो मैं भी उस दिशा में चले जाऊंगा।

दुर्भाग्य से मैं माईएसक्ल के साथ फंस गया हूं क्योंकि यह मुफ़्त है और उसने मुझे ईएफ छोड़ने के लिए मजबूर कर दिया है। अब मैं पुराने, परीक्षण, कुशल तरीके से अपने एसक्यूएल प्रश्नों को कड़ी-कोडिंग करने के लिए वापस आ गया हूं और परिणाम अच्छे हैं।

मैंने MYSQL + EF पास दिया, लेकिन मुझे उन लोगों से सुनना अच्छा लगेगा जिन्होंने इसे गैर-तुच्छ परियोजना में सफलतापूर्वक उपयोग किया है।

+0

एक ही समस्या, क्योंकि उत्पन्न SQL अच्छा नहीं है, देखें: http://stackoverflow.com/questions/3344493/limiting-query-size-with-entity- ढांचा –

+1

क्षमा करें यूआरएल गलत है http://stackoverflow.com/questions/14191998/linq-to-entity-linq-query-performance-optimization/14192078 –

2

मुझे लगता है कि पहला कदम यह पता लगाएगा कि एसक्यूएल को MySQL पर क्या भेजा जा रहा है। This आलेख बताता है कि MySQL में लॉगिंग कैसे चालू करें। यदि संभव हो तो आप देखना चाहेंगे कि .NET 4.0 beta 1 जेनरेट किए गए SQL में सुधार करता है या नहीं।

+0

को छोड़ दिया है। नेट 4 के पास इसके साथ कुछ लेना देना नहीं है। मुझे लगता है कि यह MySQL इकाई फ्रेमवर्क प्रदाता है जो क्रोधित है। –

+1

मुझे जो मिल रहा था वह वास्तव में खराब एसक्यूएल उत्पन्न हो रहा है, यह संभव है कि .NET 4.0 के साथ आप सुधार देख सकें। लेकिन सबसे पहले और सबसे महत्वपूर्ण बात यह है कि MySQL को क्या भेजा जा रहा है। –

+2

MySQL के लिए कोई अंतर्निहित प्रदाता नहीं है, इसलिए .NET 4 कोई चीज़ नहीं बदलेगा: पी मेरा अनुमान है कि 'टेक() '' LIMIT' में अनुवाद किए जाने के बजाए क्लाइंट साइड किया जाता है। – Thorarin

0

आप एसओटी को ईटी प्रदाता से ToTraceString के माध्यम से भी प्राप्त कर सकते हैं।

+0

मेरा मतलब यह है कि इसे पब के लिए टिप्पणी के रूप में पोस्ट करना है जवाब, वास्तव में। उसे श्रेय दो, मुझे नहीं। :) –

+0

एसक्यूएल 'चयन * से है (पोस्ट से चुनें *) ऑर्डर द्वारा जोड़ा गया है desc desc 0,20' पर, कृपया इसे देखें, यह मूल रूप से एक ही प्रश्न है: http://stackoverflow.com/questions/14191998/linq-to -entity-linq-query-performance-optimization/14192078 # 14192078 –

1

मैंने ओपन सोर्स प्रोजेक्ट डीबीलिनक का उपयोग करके लिंक से एसक्यूएल के साथ सफलतापूर्वक माइस्क्ल का उपयोग किया है। मैं इसे एंटिटी फ्रेमवर्क नहीं जानता लेकिन प्रोब्रामिंग मॉडल परिचित हैं। उम्मीद है कि यह किसी की मदद करता है!

संबंधित मुद्दे