2016-04-02 2 views
0

В настоящее время я работаю над этим запросом в EF 6.Проблема производительности Entity Framework с запросом

using (var metadata = new DMSEntities()) 
{ 
    var q = from row in metadata.db_Patient orderby row.Name 
        where !row.isDeleted where row.FileLocation.StartsWith(SearchTerm) 
        || row.Name.StartsWith(SearchTerm) 
        || row.Surname.StartsWith(SearchTerm) 
        || row.IDNumber.StartsWith(SearchTerm) 
        || row.Initials.StartsWith(SearchTerm) 
        select new bl_Patient 
        { 
         Name = row.Surname, 
         Surname = row.Name, 
         IDNumber = row.IDNumber, 
         Initials = row.Initials, 
         Location = row.FileLocation, 
         patientID = row.patientID 
        }; 

    var FCount = q.FutureCount(); 

    var Results = q.Skip(Paging.Skip).Take(Paging.Take).Future(); 

    var Count = FCount.Value; 
    var TotalPages = Count/10; 

    if (TotalPages!= 0 && Count % TotalPages != 0) 
    { 
     TotalPages = TotalPages+1; 
    } 

    Paging.TotalPages = TotalPages; 

    return Results.ToList(); 
} 

Есть в любом случае для увеличения производительности. У меня нет доступа к студии sql, поэтому создание представлений или хранимых процедур не будет работать. На моей тестовой машине все работает отлично, однако на клиентах гораздо медленнее ноутбук, который он висит при первой загрузке. Любая помощь будет оценена по достоинству.

Редактировать: Я вижу, что мой вопрос настроен на удержание, поэтому позвольте мне посмотреть, смогу ли я прояснить некоторые вещи.

Прежде всего это приложение для форм Windows, которое я создал, чтобы помочь одному из моих друзей. База данных и приложение запускаются с одной машины. Я использую SQL-сервер. Никаких требований, согласованных мной или клиентом, не было, поскольку это было сделано просто как одолжение. Ноутбук имеет двухъядерный 2,4-гигабайт и 4 ГБ оперативной памяти и составляет около 4 лет. Я задал вопрос, потому что хотел узнать, есть ли другие советы, которые можно дать. Я объяснил клиенту, что нет реального способа повысить производительность, поскольку реальной проблемой является ноутбук. Мы нашли способы решения проблемы, и клиент может использовать приложение сейчас. Также просто, чтобы вы, ребята, знали, что у меня всего около полутора лет опыта разработки, поэтому я задал этот вопрос больше, чтобы увеличить свой собственный навык, а затем решить актуальную проблему.

Дополнительная информация о том, что я изменил.

Я выполнил минимум 3 буквы на элементах поиска. Это в основном решило проблему.

Я также добавил некоторые индексирования, поскольку они никогда не делали этого раньше и должны были читать по этому поводу.

В базе данных имеется около 4000 предметов, но по-прежнему они иногда висят, но теперь они менее подвержены сбоям и полностью пригодны для использования.

На фоне приложения это просто управление пациентами и расположение там папок. Я только опубликовал этот запрос, поскольку это единственный вопрос, который дает проблемы. Других методов списка нет.

+0

Вы хотите получить ответ на основе только одного запроса? Как насчет некоторой информации о приложении и архитектуре. Все ли работает на одной машине? Можно ли даже ожидать, что он будет работать на клиентской машине? С какими минимальными требованиями к оборудованию вы соглашались с клиентом? Как насчет индексов? Размер таблицы/базы данных? –

+0

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

+0

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

ответ

3

Сканирование таблицы. Вы не можете многое сделать.

Вы ищете строку, которая начинается с ввода - это хорошо, то есть sargeable, что может помочь индекс.

Но вы делаете это в 5 полях. Будем надеяться, что у каждого из них есть индекс (или они являются частью индекса, в котором они появляются FIRST). Но даже тогда - проверьте план SQL и запросов, есть вероятность, что SQL Server говорит «хорошо, я скорее сделаю сканирование таблицы». И вот ты туда.

Вы также считаете результаты (q.FutureCount();) - что означает, что SQL Server должен выполнить запрос AGAIN (2 раза), но на этот раз для всей таблицы.

Скорость окно:

  • убить будущий запрос. Если вам это действительно нужно, выпустите его на SECOND CONNECTION (так что это может произойти параллельно), но определенно только один раз (сохранить результат).
  • Проверьте созданный SQL, индексы и план запроса. Забудьте о стороне EF для этого типа вопроса - все это решает вокруг SQL. Я не говорю «не используйте EF» - я говорю, чтобы найти ошибку в SQL-запросе, а не в коде уровня EF.
  • Обязательно установите правильную изоляцию tx. ReadCommited для обоих запросов. В частности, если вы запускаете два утверждения параллельно.Это может/должно быть установлено в строке соединения.
+0

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

Смежные вопросы