у меня есть полный внешнее соединение запрос вытягивать данные из SQL Compact базы данных (я использую Ef6 для отображения):LINQ вложенных групп производительность
var query =
from entry in left.Union(right).AsEnumerable()
select new
{
...
} into e
group e by e.Date.Year into year
select new
{
Year = year.Key,
Quartals = from x in year
group x by (x.Date.Month - 1)/3 + 1 into quartal
select new
{
Quartal = quartal.Key,
Months = from x in quartal
group x by x.Date.Month into month
select new
{
Month = month.Key,
Contracts = from x in month
group x by x.Contract.extNo into contract
select new
{
ExtNo = month.Key,
Entries = contract,
}
}
}
};
, как вы можете видеть, я использовать вложенные группы, чтобы структурировать результаты. Интересно, если я удалю вызов AsEnumerable(), запрос займет 3,5 раза больше времени: ~ 210 мс против ~ 60 мс. И когда он запускается в первый раз, разница намного больше: 39000 (!) Мс против 1300 мс.
Мои вопросы:
Что я делаю не так, может быть, эти группы должны делать по-другому?
Почему первое исполнение занимает так много времени? Я знаю, что деревья выражений должны быть построены и т. Д., Но 39 секунд?
Почему linq для db медленнее, чем linq для объектов в моем случае? Это вообще медленнее и лучше загружать данные из db, если это возможно, перед обработкой?
thakns!
'AsEnumerable' переносит данные в память перед группировкой. Удаление это означает, что несколько подзапросов запускаются против db, что приводит к замедлению работы. – Enigmativity