2010-05-21 18 views
7

मुझे MySQL और Entity Framework 4.0 के साथ एक गंभीर समस्या है। मैंने ईएफ डिजाइनर सतह पर एक टेबल गिरा दी है, और सब कुछ ठीक लगता है। हालांकि, जब मैं निम्नलिखित फैशन में एक प्रश्न करते हैं:सी # इकाई फ्रेमवर्क MySQL धीमी क्वेरीज गणना()

SELECT `GroupBy1`.`A1` AS `C1` 
FROM (SELECT Count(1) AS `A1` 
     FROM (SELECT `pricing table`.`a`, 
         `pricing table`.`b`, 
         `pricing table`.`c`, 
         `pricing table`.`d`, 
         `pricing table`.`e`, 
         `pricing table`.`f`, 
         `pricing table`.`g`, 
         `pricing table`.`h`, 
         `pricing table`.`i` 
       FROM `pricing table` AS `pricing table`) AS `Extent1`) AS `GroupBy1` 

के रूप में स्पष्ट होना चाहिए, यह एक excruciatingly unoptimized क्वेरी है:

using(entityContext dc = new entityContext()) { 
    int numRows = dc.myTable.Count(); 
} 

क्वेरी जो उत्पन्न होता है कुछ इस तरह लग रहा है। यह हर पंक्ति का चयन कर रहा है! यह इष्टतम नहीं है, और न ही इस बिंदु पर MySQL + EF का उपयोग करना मेरे लिए भी संभव है।

मैंने MySQL 6.3.1 दोनों को स्थापित करने की कोशिश की है [जो इंस्टॉल करने में मजेदार था] और DevArt के MyCQL के लिए dotConnect और दोनों एक ही परिणाम उत्पन्न करते हैं। इस तालिका में 1.5 मिलियन रिकॉर्ड हैं .. और निष्पादित करने के लिए 6-11 लगते हैं!

क्या मैं गलत कर रहा हूँ? क्या इस [और अन्य प्रश्न] को सायन कोड बनाने के लिए अनुकूलित करने का कोई तरीका है:

SELECT COUNT(*) FROM table 

?

SQLServer का उपयोग कर एक ही क्वेरी उत्पन्न करने में लगभग कोई समय नहीं लगता है और सेन कोड उत्पन्न करता है।

सहायता!

संपादित करें: मैं यह भी इंगित करना चाहूंगा कि मैंने DevArt dotConnect MySQL LINQ को SQL ड्राइवर में स्विच किया है और EF पर L2S का उपयोग 1000000x तेज है। इसमें प्रश्न भी शामिल हैं।

का चयन करना ईएफ में पूरी तरह से बोनर प्रश्न उत्पन्न करता है।

dc.pricing_table.OrderBy(j => j.a).Skip(100).Take(100).ToList(); 

SELECT `Extent1`.`a`, 
     `Extent1`.`b`, 
     `Extent1`.`c`, 
     `Extent1`.`d`, 
     `Extent1`.`e`, 
     `Extent1`.`f`, 
     `Extent1`.`g`, 
     `Extent1`.`h`, 
     `Extent1`.`i` 
FROM  (SELECT `pricing table `.`a`, 
       `pricing table `.`b`, 
       `pricing table `.`c`, 
       `pricing table `.`d`, 
       `pricing table `.`e`, 
       `pricing table `.`f`, 
       `pricing table `.`g`, 
       `pricing table `.`h`, 
       `pricing table `.`i` 
      FROM `pricing table ` AS `pricing table`) AS `Extent1` 
ORDER BY `a` ASC 
LIMIT 100,100 

फिर, एक पूरी तरह से गलत गलत क्वेरी। LIMIT 100,100 बिल्कुल गलत जगह पर है। यह निश्चित रूप से मेरे लिए काम नहीं करेगा।

+0

जब आप क्वेरी को फिर से लिखते हैं तो क्या होता है: int numRows = dc.myTable.Select (a => a.AnyColumnInPricingTable)। गणना(); –

+0

मैं बच्चा नहीं .. उपरोक्त के समान उत्पादन। –

उत्तर

7

समस्या इस तथ्य से जुड़ी हो सकती है कि आपके पास .edmx या .edml फ़ाइल में क्वेरी परिभाषित है।
डिज़ाइनर आपके पास देखने के मामले में अक्सर DefiningQuery उत्पन्न करता है, या आपकी तालिका में प्राथमिक कुंजी परिभाषित नहीं है। कृपया अपने मॉडल के एक्सएमएल कोड की जांच करें और यदि यह मौजूद है तो अनावश्यक है तो DefiningQuery को हटा दें।

+0

+1। और यदि आपके पास किसी टेबल पर पीके नहीं है, तो इसे जोड़ें। यदि आपके पास किसी दृश्य के लिए EDMX में कोई कुंजी परिभाषित नहीं है, तो उसे भी जोड़ें। –

+0

ओएच वाह! क्या इसे डिज़ाइनर में सेट करने/इससे बचने का कोई तरीका है, या हमेशा एक आवश्यकता संपादित कर रहा है? आप बिल्कुल सही थे, एक DefiningQuery था जो पारित हो रहा था। यही वह है जो मुझे ईएफ न्यूब होने के लिए मिलता है। हालांकि एल 2 एस माईएसक्यूएल ने बहुत अच्छा काम किया, जो मैंने इंतजार करते हुए किया था। धन्यवाद देवता! –

+0

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

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