Почему SQL, создаваемый LINQ-to-Entities, настолько неэффективен? - PullRequest
0 голосов
/ 29 апреля 2009

Следующий (сокращенный) фрагмент кода представляет собой запрос Linq-To-Entities, который приводит к SQL (через ToTraceString), который на намного медленнее, чем запрос, созданный вручную. Я делаю что-то глупое или Linq-to-Entities просто плохо оптимизирует запросы?

У меня есть ToList () в конце запроса, так как мне нужно выполнить его, прежде чем использовать его для построения структуры данных XML (что было совсем другой болью).

var result = (from mainEntity in entities.Main
              where (mainEntity.Date >= today) && (mainEntity.Date <= tomorrow) && (!mainEntity.IsEnabled)
              select new
              {
                  Id = mainEntity.Id,
                  Sub =
                      from subEntity in mainEntity.Sub
                      select
                      {
                          Id = subEntity.Id,
                          FirstResults =
                              from firstResultEntity in subEntity.FirstResult
                              select new
                              {
                                  Value = firstResultEntity.Value,
                              },
                          SecondResults =
                              from secondResultEntity in subEntity.SecondResult
                              select
                              {
                                  Value = secondResultEntity.Value,
                              },
                          SubSub =
                              from subSubEntity in entities.SubSub
                              where (subEntity.Id == subSubEntity.MainId) && (subEntity.Id == subSubEntity.SubId)
                              select
                                  new
                                  {
                                      Name = (from name in entities.Name
                                              where subSubEntity.NameId == name.Id
                                              select name.Name).FirstOrDefault()
                                  }
                          }
              }).ToList();

Работая над этим, у меня также есть некоторые реальные проблемы с датами. Когда я просто попытался включить возвращенные даты в свою структуру данных, я получил внутреннюю ошибку "1005".

Ответы [ 2 ]

7 голосов
/ 29 апреля 2009

Как общее замечание, не основанное на практическом опыте работы с Linq-To-Entities (пока): наличие четырех вложенных подзапросов в одном запросе не выглядит слишком эффективным и быстрым с самого начала.

Я думаю, что ваше очень широкое утверждение о (недостаточном) качестве SQL, сгенерированного Linq-to-Entities, не является оправданным - и вы не подкрепляете его большим количеством свидетельств.

Несколько уважаемых людей, включая Рико Мариани (MS Performance guru) и Джули Лерман (автор "Programming EF"), показали в различных тестах, что в целом и в целом, «движки» Linq-to-SQL и Linq-to-Entities не так уж и плохи - они достигают в целом не менее 80-95% возможной пиковой производительности. Не каждый разработчик приложений .NET может достичь этого: -)

Можно ли как-нибудь переписать этот запрос или изменить способ получения фрагментов, составляющих его содержимое?

Марк

0 голосов
/ 29 апреля 2009

Вы пытались не материализовать результат немедленно, вызывая .ToList ()? Я не уверен, что это будет иметь значение, но вы можете увидеть улучшение производительности, если вы будете перебирать результат вместо вызова .ToList () ...

foreach( var r in result )
{
  // build your XML
}

Кроме того, вы можете попробовать разбить один огромный запрос на отдельные запросы, а затем выполнить итерации по результатам. Отправка всего одним залпом может быть проблемой.

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