2016-08-23 3 views
1

У меня есть запрос ниже, который чрезвычайно медленный. Я новичок в Entity Framework, и я считаю, что он должен что-то сделать с помощью Eager Loading, Lazy Loading или Explicit Loading. Нужна помощь в оптимизации приведенного ниже оператора C#.Entity Framework. Включить производительность Проблема

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

Нужно ли загружать все объекты одновременно? Вы используете их все? Вы пробовали 'Lazy loading'? –

+0

@ AdilMammadov не пробовал ленивую загрузку. если бы я работал с ленивой загрузкой, то что я должен изменить в коде выше? –

ответ

1

Любой Include() вызов переводится на SQL join оператора и количество соединений в ваш пример очень серьезно. Если вам действительно нужно выполнить все подключения, я бы оптимизировал индексы, посмотрев план выполнения БД.

4

Вы можете улучшить производительность многих приложений, создав два или более небольших запроса данных из базы данных, как показано ниже. Согласно моему опыту, вы можете предоставить максимум 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(); 

Вышеприведенный небольшой набор данных из базы данных, используя несколько обращений к базе данных.

Я написал сообщение в блоге об этом. Вы тоже можете это увидеть. How to Improve Performance of Entity Framework Query ?

+0

@samppath Ссылка не найдена! – Arvand

+0

попробуйте еще раз.it работает для меня @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.Configuration.LazyLoadingEnabled = false; 
db.Configuration.ProxyCreationEnabled = false; 
Смежные вопросы