【问题标题】:How to optimize EF query?如何优化 EF 查询?
【发布时间】: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 相似的记录的列表,而不是检查所有数据库记录

【问题讨论】:

    标签: sql performance entity-framework asp.net-core query-optimization


    【解决方案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)
    猜你喜欢
    • 2022-01-14
    • 2022-07-21
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多