使用 Entity Framework 缓慢 API 调用 Azure 应用服务和 Azure 标准数据库 50 (S2)

Slow API call Azure App Service and Azure Standard database 50 (S2) with Entity Framework

我在 Azure 上托管一个应用程序用于测试。然而,许多 API 调用变得非常慢,即使性能似乎根本没有达到极限。一个 API 调用在本地使用 IIS Express 需要 170 毫秒,而 SQL Server Express 在 Azure 上需要 14485 毫秒。测试数据完全一样。有很多包含正在进行,但需要数据,如果没有包含,查询会更慢。

为什么 query/API 调用在 Azure 上这么慢?如果性能在偷看,但没有一个参数超过 60%,我可以理解。

代码:

var results = db.ElectoralDistrictResults
    .AsNoTracking()
    .Where(x => x.ElectoralDistrict.Code == addressViewModel.ElectoralDistrictCode)
    .Include(x => x.MunicipalityElectoralDistrictResult.MunicipalityResult.ConstituencyResult.CountyResult.Election.Votes.Select(y => y.Party))
    .Include(x => x.MunicipalityElectoralDistrictResult.MunicipalityResult.ConstituencyResult.CountyResult.Election.ElectionTurnout)
    .Include(x => x.MunicipalityElectoralDistrictResult.MunicipalityResult.ConstituencyResult.CountyResult.Votes.Select(y => y.Party))
    .Include(x => x.MunicipalityElectoralDistrictResult.MunicipalityResult.ConstituencyResult.CountyResult.ElectionTurnout)
    .Include(x => x.MunicipalityElectoralDistrictResult.MunicipalityResult.ConstituencyResult.CountyResult.County)
    .Include(x => x.MunicipalityElectoralDistrictResult.MunicipalityResult.ConstituencyResult.Votes.Select(y => y.Party))
    .Include(x => x.MunicipalityElectoralDistrictResult.MunicipalityResult.ConstituencyResult.ElectionTurnout)
    .Include(x => x.MunicipalityElectoralDistrictResult.MunicipalityResult.Votes.Select(y => y.Party))
    .Include(x => x.MunicipalityElectoralDistrictResult.MunicipalityResult.ElectionTurnout)
    .Include(x => x.MunicipalityElectoralDistrictResult.Votes.Select(y => y.Party))
    .Include(x => x.MunicipalityElectoralDistrictResult.ElectionTurnout)
    .Include(x => x.ElectionTurnout)
    .Include(x => x.Votes.Select(y => y.Party))
    .Include(x => x.MunicipalityElectoralDistrictResult.MunicipalityResult.Municipality.County)
    .Include(x => x.MunicipalityElectoralDistrictResult.MunicipalityElectoralDistrict)
    .Include(x => x.ElectoralDistrict)
    .ToList();

性能:

应用服务:

Basic: 1 Medium
B2
2x cores
200 total ACU
3.5 GB memory
A-Series compute

具有 50 个 DTU (S2) 的 Azure 标准数据库。

本地主机请求需要 170 毫秒

应用服务请求耗时 14485 毫秒

数据库调用本地主机:

数据库调用 Azure 数据库:

更新:

TL;DR:对慢速查询使用索引可以解决问题。

http://capesean.co.za/fixing-slow-performance-with-azure-sql-database/

如何使用 EF 6.1 创建空间索引:

原文:

在花费了大量时间之后,它似乎与 DbGeography class 有关。在 Azure Sql Server 和 SQL Server Express 中以数据类型 geography 保存。当排除这个 属性 时,查询的执行速度只比本地慢一点。我不认为数据类型是正常的。如果他们在处理这种数据类型时遇到问题,将询问 Azure。

public class Municipality
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public string Code { get; set; }

    public string Name { get; set; }

    public DbGeography Area { get; set; }

    [ForeignKey("County")]
    public string CountyCode { get; set; }

    public virtual County County { get; set; }
}

这种变慢的原因之一可能是由于带宽限制(如果每个声明的列都被获取),因为空间数据 blob 可能非常大,如果它们获取多行,如果他们的应用程序未与数据库并置。他们可以通过在返回的行顶部执行类似下面的操作来检查此数据的大小:

SUM((2 + points.HasZ + points.HasM)*8*points.STNumPoints()) as [Approx Bytes] 

可能存在实体 Framework/Entity Framework Core 以不同方式处理此数据类型的特定实例,但此处提供的答案侧重于 Geography 数据类型本身,以及它可能包含的潜在数据量和性能这将对申请产生影响。

附加信息:STNumPoints (geography Data Type) 适用于:SQL 服务器(从 2008 开始),Azure SQL 数据库