Я использовал сервер 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 тыс. Записей
Это улучшает время запроса. Я боюсь, что это может быть примерно так же хорошо, как и из-за размера db, но здесь есть улучшение после переключения из '.Contains()' в '.StartsWith()'. –
@CodyHicks - Какие скорости вы испытываете? Это медленный процесс, когда вы пытаетесь выполнить поиск с помощью длинной строки? То есть. если вы ищете 'cody'? – Aducci
Скорость срабатывает медленнее при первом запуске приложения после перезагрузки компьютера. Наверное, около 2-3 минут медленнее. Последующие поиски выполняются очень быстро, ~ 3 секунды при макс. Это когда я запускаю поиск с длинной строкой, да. Когда я ищу с датой, результат составляет ~ 1-2 секунды независимо от того, что. Мой индекс db для всех строковых столбцов: 'CREATE INDEX string_index ON table (ColumnName COLLATE NOCASE);' Я использую BINARY-сопоставление с DateTime –