使用 EF Core 8 查询大型数据集需要更长的时间,而存储过程或 SELECT 语句只需几秒钟即可执行

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

我正在使用 EF Core 8 将 WCF 应用程序迁移到 Blazor WebAssembly。 在 WCF 中,从视图中获取数据(200K 条记录)需要 10-12 秒。

我的表总共包含大约。 4500 万行,其中我过滤的行有 200000 行。

当我尝试使用 EF Core 时,需要 3 分钟。应该会在更短的时间内获取它。

我的方法如下:

public async Task<Stream> ReportDatAsync(DatbaseContext dbContext. DataDto params, CancellationToken ct)
{
    IDictionary<string, string?> searchParams = new Dictionary<string, string?>
    {
        { "Year", string.Join(",",params.Year) },
        { "Month", string.Join(",", params.Period) },
        { "Type", string.Join(",",  params.Type) }
    };

    var queryBuilder = new StringBuilder(@"SELECT * FROM table WHERE 1=1");

    foreach (var filter in searchParams)
    {
        if (filter.Value != null && filter.Value.Any())
        {
            var formattedValues = string.Join(",", filter.Value.Split(',').Select(v => $"'{v.Trim()}'"));
            queryBuilder.Append($" AND {filter.Key} IN ({formattedValues})");
        }
    }

    var queryString = queryBuilder.ToString();
    var queryText = dbContext.table.FromSqlRaw(queryString).AsNoTracking();

    var data1 = await queryText.ToListAsync(ct);
}

我不想将结果集绑定到任何模型。我在 WCF 中具有与

System.Data.Entity
相同的逻辑,它在 10-12 秒内获取数据。

我的应用程序不支持多线程同时进行多个查询。

提前感谢您的投入。

c# performance linq entity-framework-core .net-8.0
1个回答
0
投票
  • 对数据进行分页,由于性能的原因,无法一次性获取记录数,数据增加越多,性能下降越多
  • 对与数据相关的字段建立索引,提高性能
© www.soinside.com 2019 - 2024. All rights reserved.