2015-06-22 2 views
1

Я использовал сервер MS SQL несколько раз и еще не столкнулся с проблемой скорости при запросе, используя linq для сущностей. На этот раз я использую sqlite, чтобы отправить всю базу данных с приложением.sqlite query slow, как оптимизировать (используя linq для сущностей)

У меня есть приложение winforms, которое содержит 4 поля поиска. Моя цель - спроектировать поиск таким образом, чтобы результаты отражали одно поле или несколько полей (строит запрос на основе того, какие поля имеют поисковый запрос).

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

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

public List<ResultGridviewModel> GetChartsFromSearch(string patientID, string firstName, string lastName, DateTime? dateOfBirth) 
    { 
     using (var _dataContext = new dbEntities()) 
     { 

      var records = (from c in _dataContext.charts 
          select new ResultGridviewModel 
          { 
           AltID = c.AltID, 
           FirstName = c.FirstName, 
           LastName = c.LastName, 
           DateOfBirth = c.DateOfBirth, 
           Description = c.Description, 
           ServiceDateTime = c.ServiceDateTime 
          }); 


      // AltID (PatientID) 
      if (!string.IsNullOrEmpty(patientID)) 
      { 
       records = records.Where(x => x.AltID.Contains(patientID.Trim().ToUpper())); 
      } 

      // First Name 
      if (!string.IsNullOrEmpty(firstName)) 
      { 
       records = records.Where(x => x.FirstName.Contains(firstName.Trim().ToUpper())); 
      } 

      // Last Name 
      if (!string.IsNullOrEmpty(lastName)) 
      { 
       records = records.Where(x => x.LastName.Contains(lastName.Trim().ToUpper())); 
      } 

      // Date Of Birth 
      if (dateOfBirth != null) 
      { 
       records = records.Where(x => x.DateOfBirth == dateOfBirth); 
      } 


      return records.ToList(); 
     } 
    } 

Я применил индексы к этим полям в базе данных, но я чувствую, что проблема лежит в моем запросе. Любые предложения по рефакторингу для оптимизации?

База данных составляет ~ 350 тыс. Записей на данный момент и может увеличиться. В конце концов, я перестану добавлять к нему записи, но давайте предположим для приблизительной оценки, что он будет иметь ~ 700 тыс. Записей

ответ

3

Самая большая оптимизация будет менять Contains на StartsWith. Который был бы эквивалентен изменению от name like '%search%' до name like 'search%'. В противном случае SQLite не может полностью использовать индексы, размещенные в столбцах, и вы в основном ищете всю таблицу.

// First Name 
if (!string.IsNullOrEmpty(firstName)) 
{ 
    firstName = firstName.Trim().ToUpper(); 
    records = records.Where(x => x.FirstName.StartsWith(firstName)); 
} 
+0

Это улучшает время запроса. Я боюсь, что это может быть примерно так же хорошо, как и из-за размера db, но здесь есть улучшение после переключения из '.Contains()' в '.StartsWith()'. –

+0

@CodyHicks - Какие скорости вы испытываете? Это медленный процесс, когда вы пытаетесь выполнить поиск с помощью длинной строки? То есть. если вы ищете 'cody'? – Aducci

+0

Скорость срабатывает медленнее при первом запуске приложения после перезагрузки компьютера. Наверное, около 2-3 минут медленнее. Последующие поиски выполняются очень быстро, ~ 3 секунды при макс. Это когда я запускаю поиск с длинной строкой, да. Когда я ищу с датой, результат составляет ~ 1-2 секунды независимо от того, что. Мой индекс db для всех строковых столбцов: 'CREATE INDEX string_index ON table (ColumnName COLLATE NOCASE);' Я использую BINARY-сопоставление с DateTime –

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

  • Нет связанных вопросов^_^