2013-04-26 124 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的日誌記錄

請讓我們知道這有什麼意義。

問候, 邁克爾