2010-05-21 11 views
7

Mam poważny problem z MySQL i Entity Framework 4.0. Upuściłem tabelę na powierzchnię EF Designer i wszystko wydaje się w porządku. Jednak, kiedy przeprowadzić kwerendę w następujący sposób:C# Entity Framework MySQL Powolne Zapytania hrabia()

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

Kwerenda, która jest generowana wygląda mniej więcej tak:

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` 

Jak powinno być oczywiste, że jest to zapytanie excruciatingly unoptimized. To wybiera każdy pojedynczy wiersz! To nie jest optymalne, ani nawet nie mogę używać MySQL + EF w tym momencie.

Próbowałem zarówno MySQL 6.3.1 [to była zabawa do zainstalowania] i za Devart dotConnect dla MySQL i oba wytwarzają takie same wyniki. Ta tabela ma 1,5 miliona rekordów i zajmuje 6-11 sekund, aby wykonać!

Co robię źle? Czy istnieje jakiś sposób, aby zoptymalizować to [i innych zapytań] aby produkować sane kod jak:

SELECT COUNT(*) FROM table 

?

Generowanie tego samego zapytania używając SQLServer trwa praktycznie nie czas i produkuje kod sane.

Pomoc!

Edit: Chciałbym również podkreślić, że przeszedłem do Devart dotConnect MySQL LINQ to SQL i za pomocą sterownika L2S nad EF jest 1000000x szybciej. Dotyczy to również zapytań.

Wybór nic w EF zdaje się generować zupełnie Bonkers zapytań.

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 

Ponownie, całkowicie błędne zapytanie. LIMIT 100,100 znajduje się w absolutnie niewłaściwym miejscu. To oczywiście nie zadziała w ogóle dla mnie.

+0

Co się dzieje, kiedy przepisać zapytanie jak tak: int NumRows = dc.myTable.Select (a => a.AnyColumnInPricingTable) .Count(); –

+0

Nie żartuję .. identyczne wyjście jak wyżej. –

Odpowiedz

7

Problem może być związany z faktem, że masz Definiowanie kwerendę w .edmx lub .edml pliku.
Projektant często generuje DefiningQuery w przypadku, gdy masz widok lub Twoja tabela nie ma zdefiniowanego klucza głównego. Sprawdź kod XML swojego modelu i usuń DefiningQuery, jeśli jest obecny, ale niepotrzebny.

+0

+1. A jeśli nie masz PK na stole, dodaj go. Jeśli nie masz klucza zdefiniowanego w EDMX dla widoku, dodaj go również. –

+0

OH wow! Czy jest jakiś sposób ustawienia tego/uniknięcia tego w projektancie lub edytowanie zawsze wymaga? Miałeś absolutnie rację, był DefiningQuery, który został wprowadzony w. To jest to, co otrzymuję za bycie FE Newb. MySQL L2S działał jednak świetnie, co zrobiłem podczas oczekiwania. Dzięki, Devart! –

+0

Kontynuacja - Testowany, a to był rzeczywiście problem. Całkowicie dałbym ci więcej punktów, gdybym mógł. Dziękuję za wskazanie tego. Mam nadzieję, że jest jakiś inny sposób niż edycji XML dla EDMX, ale jestem szczęśliwy wiedząc, co problem jest i to rozwiązanie dla niego. –

Powiązane problemy