【问题标题】:LINQ-to-Entity query optimizationLINQ-to-Entity 查询优化
【发布时间】:2012-04-04 20:43:17
【问题描述】:

我有一个(相当长的)查询的性能问题,它需要大约 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 秒。

任何建议将不胜感激。谢谢!

【问题讨论】:

  • 您可以通过在数据库表中添加相关索引来加速查询。

标签: c# asp.net performance linq-to-entities query-optimization


【解决方案1】:

您可以在一个表单中改进此查询

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

剩下的:

  1. Daily 表:在idTicket 列上添加索引

  2. Kontakt 表:在 idKontakt 列上添加索引(如果尚未 PK)

或者更好地生成 SQL,看看 SSMS 将如何帮助您处理索引(如果您使用的是 SQL Server)

【讨论】:

  • 感谢您的回答!我试试看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
相关资源
最近更新 更多