2015-05-04 3 views
1

Мне нужна помощь в оптимизации запросов linq в C#. У меня есть небольшое приложение, оно использует структуру сущности, а внутри - некоторый код:Entity framework Linq очень медленные запросы

using (var db = new MyEntities()) 
{ 
    System.Diagnostics.Debug.WriteLine("Start: " + DateTime.Now.ToString()); 
    var myData = from table1 in db.Table1 
    join table2 in db.Table2 on table1.Key equals table2.Key 
    // more joins from various tables 
    where table1.Date > StartDate && table1.Date < EndDate 
    select table1; 
    System.Diagnostics.Debug.WriteLine("After myData: " + DateTime.Now.ToString()); 

    var count = myData.Count(); 
    System.Diagnostics.Debug.WriteLine("After Count(): " + DateTime.Now.ToString()); 
    var list = myData.ToList(); 
    foreach(var variable in list) 
    { 
    //do something; 
    } 
} 
return 

В этих таблицах имеется около 200 000 строк. Дело в том, что даже если Count() возвращает 0, Count() занимает около 10 секунд, а если есть несколько тысяч строк, то это занимает очень много времени (не менее 10 минут), а затем я получаю ошибку, эта переменная ноль. Есть ли какие-то методы или что-то, что поможет мне оптимизировать запросы linq?

+0

Я хотел бы начать, глядя на SQL, генерируемый профилировщика или EF каротаж (https://msdn.microsoft.com/en-us/data/dn469464.aspx). У вас есть индексирование по ключам? Перемещайте причину, указанную выше, перед объединением, поскольку только появляется, чтобы посмотреть на первую таблицу. Кроме того, вам может не понадобиться объединение, если у вас есть навигационные свойства в моделях. –

+0

Как долго требуется инструкция linq? Может быть, запрос ленивый, и когда вы подсчитываете данные, извлекается – Domysee

ответ

1

Я бы поспорил, что здесь нет проблемы с EF или LINQ. Ваша база данных еще должна быть построена с правильной индексацией. Если вы установили точку останова и проверили свое окно intellitrace, вы сможете увидеть фактический выполняемый запрос. Скопируйте этот запрос в SQL Server Management Studio и посмотрите, как выполняется запрос. Это может дать вам советы по настройке индексов для оптимизации этого запроса. Каждый раз, когда вы присоединяетесь, вы открываете возможность медленного выполнения запросов. Любое предложение WHERE, которое не соответствует вашим индексам, откроет возможность для медленного выполнения запросов.

Примечание. Существуют тысячи книг о надлежащем способе индексирования вашей базы данных, поэтому, пожалуйста, используйте осторожность при этом.

Примечание 2: Вместо DateTime.Now для вашего времени используйте класс секундомера. У вас будут более последовательные результаты.

var sw = Stopwatch.StartNew(); 
//do code 
sw.Stop(); 
Debug.WriteLine(sw.Elapsed); 
+0

Ну, я получил запрос SQL с помощью Database.Log = Console.Write, затем я выполнил этот запрос в MS SQL Server в моей базе данных и выполнил этот запрос почти мгновенно. Дело в том, что когда у меня есть код var myData = from table1 в db.Table1 ... – newuser205

+0

Ну, я получил запрос SQL с помощью Database.Log = Console.Write, тогда я выполнил этот запрос в MS SQL Server в моей базе данных , и он выполнил этот запрос почти мгновенно. Дело в том, что когда у меня есть код «var myData = from table1 в db.Table1 ... select table1;» это только оператор SQL, а не сами данные, но когда я делаю «var list = myData.ToList();» то список - это фактические данные, и даже если результат myData пуст, для отправки этого пустого запроса требуется около 10 секунд, и если результат имеет 10 строк. – newuser205

+0

И что было бы лучше/быстрее - 1 большой запрос linq с 10-20 соединениями и 10-20 сравнивается в части «где» или 10-20 меньших запросов без объединений и с отдельными предложениями «Where()», например «var myData = from table1 в db.Table1 select table1; myData = myData.Where (<,>,!, ...); myData = myData.Where (>, <,!=, > =); ....... "? – newuser205