Оптимизация запросов LINQ-to-Entity - PullRequest
1 голос
/ 20 марта 2012

У меня проблема производительности с одним (довольно длинным) запросом, выполнение которого занимает около 1:30 мин.Мне удалось найти часть, выполнение которой (слишком) занимает много времени, но теперь мне нужны советы по оптимизации моего запроса.

var ticketList = (from t in db.Ticket
                          select t).ToList();

        int idFirma = Convert.ToInt32(kontakt.idFirma);

        gvTicketi.DataSource = from t in ticketList
                               orderby t.idTicket, t.RedniBroj, t.DatumPrijave
                               select new
                               {
                                   t.idTicket,
                                   t.idFirma,
                                   t.idKontakt,
                                   t.idManager,
                                   t.idNadredeniTicket,
                                   TicketNumber = t.idNadredeniTicket + "-" + t.RedniBroj,
                                   t.Biljeske,
                                   t.DatumDo,
                                   t.DatumPrijave,
                                   t.OpciPrioritet,
                                   t.Opis,
                                   t.OpisZatvoren,
                                   t.Prioritet,
                                   t.Status,
                                   t.Tip,
                                   t.VrstaPrijave,
                                   t.Zatvoren,
                                   t.DatumZatvaranja,
                                   t.IzdanRacun,
                                   NazivKontakta = t.Kontakt == null ? "Bez kontakta" : t.Kontakt.Ime + " " + t.Kontakt.Prezime,
                                   Manager = t.idManager == null ? "Svi manageri" : (from k in db.Kontakt
                                                                                     where k.idKontakt == t.idManager
                                                                                     select k.Ime + " " + k.Prezime).SingleOrDefault(),
                                   NazivTvrtke = t.Firma.Naziv,
                                   DailyCount = db.Daily.Count(dt => dt.idTicket == t.idTicket && dt.Dolazak == true),
                                   DailySum = db.Daily.Count(dt => dt.idTicket == t.idTicket) == 0 ? 0 : db.Daily.Where(dt => dt.idTicket == t.idTicket).Sum(dts => dts.EfektivnoSati)
                               };

Ошибка производительности # 1

Manager = t.idManager == null ? "Svi manageri" : (from k in db.Kontakt where k.idKontakt == t.idManager select k.Ime + " " + k.Prezime).SingleOrDefault(),

Проблема производительности # 2

DailyCount = db.Daily.Count(dt => dt.idTicket == t.idTicket && dt.Dolazak == true),
DailySum = db.Daily.Count(dt => dt.idTicket == t.idTicket) == 0 ? 0 : db.Daily.Where(dt => dt.idTicket == t.idTicket).Sum(dts => dts.EfektivnoSati)

Удалив эти две части, я смог ускорить запрос до 8 секунд.

Любое предложение будет оценено.Спасибо!

1 Ответ

0 голосов
/ 20 марта 2012

Вы можете улучшить этот запрос в единой форме

DailySum  = db.Daily.Where(dt => dt.idTicket == t.idTicket)
                     .Sum(dts => (int?)dts.EfektivnoSati)

Для остальных:

  1. Daily таблица: добавить индекс для idTicket столбец

  2. Kontakt таблица: добавить индекс для столбца idKontakt (если еще нет ПК)

Или лучше сгенерируйте SQL и посмотрите, как SSMS поможет вам с индексами (это если вы используете SQL Server)

...