2016-08-23 101 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;