2013-04-26 78 views
0

可以帮助我优化下面的LINQ声明。我使用NHibernate作为ORM。此声明需要一分多钟才能执行。它不应该花那么多时间。请帮我优化这个Linq声明

var inValidIntroductionDates = environment.IntroductionDateInfo.IntroductionDateDetails 
           .OrderByDescending(x => x.ApplicationDate) 
           .Where(x => x.VaccineDetail.Id == vaccine.Id && 
              x.ViewInfo.Id == viewInfoDetail.ViewInfo.Id && 
              x.MasterForecastInfo.Id == scenarioId && 
              x.IsIntroductionDateValid == false) 
           .ToList(); 

感谢

+2

拉出从日志中生成的SQL和运行SQL数据库上查询excecution计划。我怀疑大量的行和不正确的索引 – Rippo 2013-04-26 13:46:58

回答

1

移动Where条款OrderByDescending前减少由参与声明的顺序记录数。像

var inValidIntroductionDates = environment.IntroductionDateInfo.IntroductionDateDetails 
           .Where(x => x.VaccineDetail.Id == vaccine.Id && 
            x.ViewInfo.Id == viewInfoDetail.ViewInfo.Id && 
            x.MasterForecastInfo.Id == scenarioId && 
            x.IsIntroductionDateValid == false) 
           .OrderByDescending(x => x.ApplicationDate) 
           .ToList(); 

你也可以改变

x.IsIntroductionDateValid == false 

!x.IsIntroductionDateValid 

但不会提高性能。只是一个可读性选项。

+0

对不起!没有运气它需要花费相同的时间。 – user2299182 2013-04-26 09:42:36

1
var inValidIntroductionDates = environment.IntroductionDateInfo.IntroductionDateDetails.Where(
         x => x.VaccineDetail.Id == vaccine.Id && x.ViewInfo.Id == viewInfoDetail.ViewInfo.Id && x.MasterForecastInfo.Id == scenarioId && x.IsIntroductionDateValid == false).OrderByDescending(x => x.ApplicationDate).ToList(); 

首先找到,然后订购

+0

对不起!没有运气它需要花费相同的时间。 – user2299182 2013-04-26 09:41:32

1

有些事情要考虑:

  • 请附上探查到数据库,并告诉我们如何被发送到数据库的确切 声明
  • 找出语句执行速度是否缓慢,或者如果nHibernate处理花费时间
  • 如果是数据库查询:优化st (例如索引,执行计划,...)
  • 如果有太多的查询执行:对抗N + 1
  • 如果是NHibernate的执行:关闭NHibernate的日志记录

请让我们知道这有什么意义。

问候, 迈克尔