优化选择查询 EF Core + Azure SQL Server

问题描述 投票:1回答:1

我正在使用.Net Core 3.1 在 Azure App Service 和 Azure SQL Server 中构建一个 API。

Azure应用服务规格 --> (基本层 1.7 GB Ram)

Azure Sql数据库规格--> (基本层,5个DTU和2G最大存储空间)

注:App服务和数据库在同一个区域内。

我的问题是,我面临着一个低性能,当运行一个查询,从数据库中获取数据,看起来像下面的代码。

dynamic employees = await _context.Employees
    .Where(e => e.CompanyForeignKey == Guid.Parse("d0f022df-498c-4948-9567-ddc16ed49fa0"))
    .Select(emp => new
    {
        //emp.Id,
        FullName_FL = emp.FirstName_FL + " " + emp.SecondName_FL + " " + emp.LastName_FL + " " + emp.FamilyName_FL,
        FullName_SL = emp.FirstName_SL + " " + emp.SecondName_SL + " " + emp.LastName_SL + " " + emp.FamilyName_SL,
        OldValues = emp.OldValues.Select(ov => new
        {
            ov.Value,
            ov.CalculatedValue,
            ov.Category.Name_FL,
            ov.Category.Name_SL,
            .Category.Type // just string
        }).ToList()
    })
    .AsNoTracking()
    .ToListAsync();

而且我总是得到以下错误

执行超时已过。 在完成操作之前,超时时间已经过去,或者服务器没有响应。

我的情况是,我有500个员工,每个员工有50个oldValues,每个oldValue有Category,因为每个模型都有很多字段,我使用Select来筛选需要的字段,但是当我调试时,我发现生成的SQL Query包含Category中的所有字段,而不是只有(Name_FL, Name_SL和Type)。

那么,上述问题是否是导致性能低下的原因,可能我需要对我的查询进行优化!那么我如何解决呢?

还是我的服务器规格的原因?

先谢谢你了。

sql-server asp.net-core azure-sql-database asp.net-core-webapi azure-app-service-plans
1个回答
0
投票

服务器规格不是问题。

你正在具体化到列表两次,就我所见,这不是必要的.如果而且只有在你真正需要一个列表的情况下,才在最后才这样做--这将导致不必要的开销。

创建一个类来保存你检索到的数据,避免使用 dynamic 除非你发现自己处在一个你真的不知道数据会是什么样子的情况下--在这种情况下,你知道。

解析 Guid 提前。

剖析你的疑问!


0
投票

基本5级DTU太低了,即使是DEVT测试。考虑把它变成10 - 30 DTU,然后重新尝试这个。

© www.soinside.com 2019 - 2024. All rights reserved.