如何优化 EF 查询?
Posted
技术标签:
【中文标题】如何优化 EF 查询?【英文标题】:How to optimize EF query? 【发布时间】:2021-08-11 11:34:27 【问题描述】:我有一个返回 31,000 条记录的查询,但在 EF 上运行速度非常慢。我想优化这个查询。我应该如何优化它?
[HttpGet]
public IActionResult SearchInTaminJobs(string term)
var query = _context.TaminJobs.Where(Ad => Ad.jobName.Contains(term)).Select(c =>
c.jobName + c.jobCode).ToList();
return Ok(query);
我写的这个查询会检查所有数据库记录。但是现在我想要一个查询去获取前 20 条与 jobName 相似的记录的列表,而不是检查所有数据库记录
【问题讨论】:
【参考方案1】:我相信这不是 EF 问题。在您的查询中,您使用contains
和全表扫描,即您遍历所有记录并为每条记录检查jobname
是否包含文本片段。而且由于它是contains
检查,您不能只在此列上建立索引。所以你的查询很慢。您还返回了许多记录,这也会对执行时间产生影响。尝试在执行contains
之前添加更多过滤(通过一些索引id
或类似的)。
为确保您的查询速度较慢,请在 SSMS 中运行以下原始 sql 查询:select jobName + jobCode from TaminJobs where jobName like '%YOUR_TERM_HERE%'
。
您也可以尝试限制将返回的记录数:_context.TaminJobs.Where(Ad => Ad.jobName.Contains(term)).Take(20)
【讨论】:
那么应该如何优化呢? sql查询执行多长时间?也试试这个Try to add more filtering before doing contains
如果表很大并且你真的想通过%SOMETHING%
过滤而不进行任何其他过滤(即你不能缩小jobName
的扫描和索引区域对你没有帮助),您可以 1.
将整个表加载到应用程序内存中,然后进行过滤 2.
或做一些 FTS docs.microsoft.com/en-us/sql/relational-databases/search/… 这可能对您的情况来说是多余的
我有一个想法但我不知道代码,你能帮我吗?我编写的这个查询会检查所有数据库记录。但是现在我想要一个查询去获取与 jobName 相似的前 20 条记录的列表,而不是检查所有数据库记录
试试这个_context.TaminJobs.Where(Ad => Ad.jobName.Contains(term)).Take(20)
以上是关于如何优化 EF 查询?的主要内容,如果未能解决你的问题,请参考以下文章