2011-11-28 240 views
0

我只是想知道如果任何人都可以提供任何建议,以改善我的查询。LINQ到SQL - 慢查询

基本上,它会将2行合并到1中。唯一不同的行是'类型'字符列('S'或'C')和值。我想要做的是用'S'值和'C'值选择一行,并计算差值(S-C)。

我的查询很有用,但速度很慢 - 大约需要8秒才能得到结果,这对我的应用程序来说并不理想。我希望我可以改变数据库结构,但我不能伤心!

这里是我的查询:

var sales = (from cm in dc.ConsignmentMarginBreakdowns 
      join sl in dc.SageAccounts on new { LegacyID = cm.Customer, Customer = true } equals new { LegacyID = sl.LegacyID, Customer = sl.Customer } 
      join ss in dc.SageAccounts on sl.ParentAccount equals ss.ID 
      join vt in dc.VehicleTypes on cm.ConsignmentTripBreakdown.VehicleType.Trim() equals vt.ID.ToString() into vtg 
      where cm.ConsignmentTripBreakdown.DeliveryDate >= dates.FromDate && cm.ConsignmentTripBreakdown.DeliveryDate <= dates.ToDate 
      where (customer == null || ss.SageID == customer) 
      where cm.BreakdownType == 'S' 
      orderby cm.Depot, cm.TripNumber 
      select new 
      { 
       NTConsignment = cm.NTConsignment, 
       Trip = cm.ConsignmentTripBreakdown, 
       LegacyID = cm.LegacyID, 
       Costs = dc.ConsignmentMarginBreakdowns.Where(a => a.BreakdownType == 'C' && a.NTConsignment == cm.NTConsignment && a.LegacyID == cm.LegacyID && a.TripDate == cm.TripDate && a.Depot == cm.Depot && a.TripNumber == cm.TripNumber).Single().Value, 
       Sales = cm.Value ?? 0.00m, 
       Customer = cm.Customer, 
       SageID = ss.SageID, 
       CustomerName = ss.ShortName, 
       FullCustomerName = ss.Name, 
       Vehicle = cm.ConsignmentTripBreakdown.Vehicle ?? "None", 
       VehicleType = vtg.FirstOrDefault().VehicleTypeDescription ?? "Subcontractor" 
      }); 

回答

1

当优化Linq到SQL查询时,一个好的开始是SQL Server Profiler。在那里你可以找到Linq to SQL生成的SQL代码。从那里,你可以玩弄linq查询,看看你是否可以写出更好的查询。如果这不起作用,你可以随时手动编写一个存储过程,然后从Linq调用它到SQL。

1

真的是没有提供作出明智的意见的足够信息。例如,每个表中有多少行?生成的T-SQL看起来像什么?

我首先建议的一件事就是拿出输出的T-SQL,生成查询计划并查找表或索引扫描。