2016-08-23 156 views
1

我有以下查詢這是極其緩慢的。我是Entity Framework的新手,我相信它必須通過Eager Loading,Lazy Loading或Explicit Loading來做些事情。需要幫助優化下面的C#語句。實體框架.INCLUDE性能問題

var queryResult = CurrentSession.Set<SomeType_T>().Include(a => a.SomeType1_T) 
           .Include(a => a.SomeType1_T.Catalog_Type_T) 
           .Include(a => a.SomeType1_T.SomeType4_T) 
           .Include(a => a.SomeType1_T.SomeType2_T) 
           .Include("SomeType1_T.SomeType2_T.SomeType3_T") 
           .Include(a => a.SomeType1_T.SomeType4_T.SomeType5_T) 
           .Include(a => a.SomeType1_T.SomeType5_T) 
           .Include(a => a.SomeType1_T.Questions_T) 
           .Include(a => a.SomeType1_T.Questions_T.Question_Type_T) 
           .Include(a => a.SomeType1_T.Members_T) 
           .Include(b => b.SomeMasterType_T) 
           .Include(b => b.SomeMasterType_T.SomeMasterType1_T) 
           .Include(c => c.SomeType6_T) 
           .Include(d => d.SomeType7_T) 
           .Include(d => d.SomeType8_T) 
           .Include(d => d.SomeType8_T1) 
           .Where(t => t.SomeType9_T == _MatchThisKey); 
+3

僅包含您需要的那些實體 –

+0

您是否必須一次加載所有實體?你全部使用它們嗎?你有沒有嘗試'懶加載'? –

+0

@AdilMammadov還沒有試過懶加載。如果我沒有使用延遲加載,那麼我應該在上面的代碼中改變什麼? –

回答

1

任何Include()調用轉換爲SQL join運營商的數量和連接在你的例子是非常嚴重的。如果你真的需要執行所有的連接,我會通過查看DB引擎執行計劃來優化索引。

4

可以提高性能的許多包括通過建立從如圖所示below.According我的經驗數據庫2個以上的小數據請求時,你可以給每個query.More最多2包括除這將使非常糟糕的表現。是的,這是醜陋的。但它會帶來非常好的性能提升。你也可以嘗試和感覺:)

注意:這只是一個例子。

var userData = from u in db.Users 
         .Include(p=>p.UserSkills) 
         .Include(p=>p.UserIdeas) 
         .FirstOrDefault(); 

userData = from u in db.Users 
        .Include(p=>p.UserFriends) 
        .Include(p=>p.UserFriends1) 
        .FirstOrDefault(); 

上面將通過使用多個遍歷到數據庫從數據庫中帶來小型數據集。

我已經寫了一篇博客文章this.You可以看到這一點。 How to Improve Performance of Entity Framework Query ?

+0

@samppath找不到鏈接! – Arvand

+0

再試一次。它對我有用@Arvand – Sampath

1

如果您不需要預先提供所有數據,另一個選擇是使用異步加載您的集合。

例如:

var initialResult = db.Person.Include(c=>c.FirstCollection).First(); 
var load1 = db.Entry(initialResult).Collection(c=>c.SecondCollection).LoadAsync();  
//do all the work you can 
await load1; 
//continue with more work 

你也應該考慮.AsNoTracking(),如果你不上編輯和保存實體回DB計劃。它提供了一個小的性能提升,但不會爲將來的查詢緩存實體。

如果你要明確地處理所有的集合裝載熱切或代碼以後再使用這些也因爲他們也給一個小的性能提升。

db.Configuration.LazyLoadingEnabled = false; 
db.Configuration.ProxyCreationEnabled = false;