C # Entity FrameWork MySQL Количество медленных запросов () - PullRequest
7 голосов
/ 21 мая 2010

У меня серьезная проблема с MySQL и Entity Framework 4.0. Я бросил Стол на поверхность EF Designer, и все, кажется, в порядке. Однако, когда я выполняю запрос следующим образом:

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

Сгенерированный запрос выглядит примерно так:

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`

Как должно быть очевидно, это мучительно неоптимизированный запрос. Он выбирает каждую строку! Это не оптимально, и я даже не могу использовать MySQL + EF на этом этапе.

Я пробовал и MySQL 6.3.1 [это было интересно установить], и DevCont dotConnect для MySQL, и оба дали одинаковые результаты. Эта таблица содержит 1,5 миллиона записей .. и для ее выполнения требуется 6-11 секунд!

Что я делаю не так? Есть ли способ оптимизировать этот [и другие запросы] для получения вменяемого кода, например:

SELECT COUNT(*) FROM table

Генерация одного и того же запроса с использованием SQLServer практически не занимает много времени и дает вменяемый код.

Помощь!

Редактировать: Я также хотел бы отметить, что я переключился на драйвер DevArt dotConnect MySQL LINQ to SQL и использование L2S через EF в 1000000 раз быстрее. Это включает и запросы.

Выбор что-нибудь в EF, кажется, генерирует полностью помешанные запросы.

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

Опять совершенно неправильный запрос. ПРЕДЕЛ 100,100 находится в абсолютно неправильном месте. Это, конечно, не будет работать для меня вообще.

1 Ответ

7 голосов
/ 21 мая 2010

Проблема может быть связана с тем, что в вашем файле .edmx или .edml у вас есть Определение вопроса.
Designer генерирует DefiningQuery часто в том случае, если у вас есть View или в вашей таблице не определен первичный ключ. Пожалуйста, проверьте код XML вашей модели и удалите DefiningQuery, если он присутствует, но не нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...