【发布时间】:2012-10-11 14:02:40
【问题描述】:
我正在使用这个 linq 查询,当我运行我的 asp.net 应用程序时,它需要 50 秒才能运行,但是在 LinqPad 和 Sql Management Studio 中,相同的查询在 500 毫秒内执行。
我什至从 SQL Profiler 中获取查询,然后在 SQL Management Studio 中再次运行它,大约需要 500 毫秒。 Linq 可以做什么开销,额外的 49 秒?
以下是代码供参考,感谢您的帮助。
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();
【问题讨论】:
-
令人印象深刻的查询。您决定从 Query 语法开始并以 Method 语法结束是有原因的吗?我无法跟踪您的查询正在做什么。如果你用查询语法重写查询,可能更容易发现一些优化
-
能把生成的SQL贴出来吗?
-
@Thom Smith,直接来自 sql profiler gist.github.com/3872906,它的 1500 行,但仍然运行不到一秒
-
对答案提供反馈很有帮助。它提供了一个共同努力解决问题的机会,它让回答问题的人觉得他们没有浪费时间。
标签: sql-server linq