J'ai cette requête linq que j'utilise et cela prend 50 secondes à courir quand je l'exécute mon application asp.net, mais la même requête s'exécute en 500ms dans LinqPad et Sql Management Studio.Requête lente dans Linq, rapide dans LinqPad, SQL Management Studio et SQL Profiler
J'ai même pris la requête du profileur SQL et l'ai réexécutée dans SQL Management Studio et cela prend environ 500ms. Quels frais généraux Linq pourrait-il faire, que 49 supplémentaires ??
Ci-dessous le code de référence, merci pour votre aide.
var rCampaign =
(from a in db.AdCreative
join h in db.AdHit on a.ID equals h.AdID into gh
join l in db.AdGroup_Location on a.AdGroupID equals l.AdGroupID into gj
from subloc in gj.DefaultIfEmpty()
from subhits in gh.DefaultIfEmpty()
where a.AdGroup.AdHost.Select(q => q.ID).Contains(rPlatform.ID) &&
a.AdGroup.AdPublisher.Select(q => q.ID).Contains(rPublisher.ID) &&
a.AdDimensionID == AdSize &&
a.AdGroup.Campaign.Starts <= rNow &&
a.AdGroup.Campaign.Ends >= rNow &&
subhits.HitType == 1 &&
(subloc == null || subloc.LocationID == rLocationID)
select new {
ID = a.ID,
Name = a.Name,
Spent = (subhits.AdDimension != null) ? ((double)subhits.AdDimension.Credit/1000) : 0,
CampaignID = a.AdGroup.Campaign.ID,
CampaignName = a.AdGroup.Campaign.Name,
CampaignBudget = a.AdGroup.Campaign.DailyBudget
}).GroupBy(adgroup => adgroup.ID)
.Select(adgroup => new {
ID = adgroup.Key,
Name = adgroup.FirstOrDefault().Name,
Spent = adgroup.Sum(q => q.Spent),
CampaignID = adgroup.FirstOrDefault().CampaignID,
CampaignName = adgroup.FirstOrDefault().CampaignName,
CampaignBudget = adgroup.FirstOrDefault().CampaignBudget,
})
.GroupBy(q => q.CampaignID)
.Select(campaigngroup => new {
CampaignID = campaigngroup.Key,
DailyBudget = campaigngroup.FirstOrDefault().CampaignBudget,
Consumed = campaigngroup.Sum(q => q.Spent),
RemainningCredit = campaigngroup.FirstOrDefault().CampaignBudget - campaigngroup.Sum(q => q.Spent),
Ads = campaigngroup.Select(ag => new {
ID = ag.ID,
Name = ag.Name,
Spent = ag.Spent
}).OrderBy(q => q.Spent)
})
.Where(q => q.Consumed <= q.DailyBudget).OrderByDescending(q => q.RemainningCredit).First();
requête impressionnante. Y a-t-il une raison pour laquelle vous avez décidé de commencer avec la syntaxe Query et de terminer avec la syntaxe de la méthode? J'ai du mal à suivre ce que fait votre requête. Si vous réécrivez la requête dans la syntaxe de requête, il peut être plus facile de repérer certaines optimisations. – Aducci
Pourriez-vous publier le code SQL généré? –
@Thom Smith, à partir de sql profiler https://gist.github.com/3872906, sa ligne 1500, mais fonctionne encore en moins d'une seconde –