У меня есть серьезная проблема с MySQL и Платформой Объекта 4.0. Я отбросил Таблицу на поверхность Разработчика EF, и все кажется OK. Однако, когда я выполняю запрос следующим способом:
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 [который был забавой установить] и dotConnect DevArt для MySQL, и оба приводят к тем же результатам. Эта таблица имеет 1,5 миллиона записей.. и берет 6-11s для выполнения!
Что я делаю неправильно? Есть ли любой способ оптимизировать это [и другие запросы] для создания нормального кода как:
SELECT COUNT(*) FROM table
?
Генерация того же запроса с помощью SQLServer не занимает фактически времени и производит нормальный код.
На помощь!
Править: Я также хотел бы указать, что я переключился на MySQL LINQ DevArt dotConnect к драйверу SQL, и использующий L2S по EF 1000000x быстрее. Это включает запросы также.
Выбор чего-либо в 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
Снова, полностью bassackwards неправильно запрашивают. ПРЕДЕЛ 100,100 находится в абсолютно неправильном месте. Это, конечно, не будет работать на меня вообще.
Проблема может быть связана с тем, что у вас есть определяющий запрос в вашем файле .edmx или .edml.
Designer часто генерирует DefiningQuery, если у вас есть View или в вашей таблице не определен первичный ключ. Пожалуйста, проверьте XML-код вашей модели и удалите DefiningQuery, если он присутствует, но не нужен.