sqlite查询速度慢,如何优化(使用linq到实体)

本文关键字:使用 查询 linq 实体 优化 何优化 sqlite 速度慢 | 更新日期: 2023-09-27 17:59:02

我已经使用过几次MS SQL server,在使用linq对实体进行查询时还没有遇到速度问题。这一次,我使用sqlite,以便随应用程序一起运送整个数据库。

我有一个winforms应用程序,它包含4个搜索字段。我的目标是以这样一种方式设计搜索,即结果反映单个字段或多个字段(基于哪些字段具有搜索项来构建查询)。

目前,我的查询可以工作,但对sqlite数据库执行查询需要相当长的时间。尤其是在第一次跑步时。我认为这是因为sqlite背后没有强大的服务器,结果在本地处理并加载到内存中。我认为数据库正在自行索引,或者第一次必须建立某种缓存。

如何将linq查询优化为sqilte?在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();
        }
    }

我已经在数据库中对这些字段应用了索引,但我觉得问题出在我的查询中。有关于重构优化的建议吗?

截至目前,该数据库约有35万条记录,而且可能会扩大。最终,我将停止向其中添加记录,但让我们假设它将有大约700k条记录

sqlite查询速度慢,如何优化(使用linq到实体)

最大的优化是将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));
}