【发布时间】: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