从 Microsoft.EntityFrameworkCore.SqlServer 2.0.0 升级到 7.0.3 时使用多个包含的慢查询

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

我正在将我的项目从带有 netcoreapp2.0 的 Microsoft.EntityFrameworkCore.SqlServer 2.0.0 升级到带有 net7.0 的 7.0.0

我的代码基准:

对于 2.0.0:

[MemoryDiagnoser]
    public class EF2BenchMark
    {
        [Benchmark]
        public async Task RunAsync()
        {
            using (var context = new Context(""))
            {
                var query = context.Customers.Where(x => !x.Deleted.HasValue);
                query = query.Where(x => x.PrimaryEmail == "[email protected]");
                query = query
                .Include(x => x.Permission)
                .Include(x => x.UserIds);

                query = query
                    .Include(x => x.CustomerProfiles).ThenInclude(x => x.Address)
                    .Include(x => x.CustomerProfiles).ThenInclude(x => x.Index)
                    .Include(x => x.CustomerProfiles).ThenInclude(x => x.CustomerValue);

                query = query.Include(x => x.ClassProfile).ThenInclude(x => x.Bags)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.ClubShaftLength)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.ClubShaftFlex)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.ClubCategoryType)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.FaceLoftAdjustment)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.FaceLieAdjustment)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.ClubLoft)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.ClubCategory)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.Brand)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.Model);

                query = query.Include(x => x.ClassProfile.TimePlayingGolf)
                    .Include(x => x.ClassProfile.NewHandicap)
                    .Include(x => x.ClassProfile.CurrentIronLength)
                    .Include(x => x.ClassProfile.CurrentDriverFlex)
                    .Include(x => x.ClassProfile.DriverLoft)
                    .Include(x => x.ClassProfile.CurrentIronLie)
                    .Include(x => x.ClassProfile.DesiredDriverFlex)
                    .Include(x => x.ClassProfile.ClubHand);

                var customer = await query.FirstOrDefaultAsync();
            }
        }
    }

结果:

对于 7.0.3:

[MemoryDiagnoser]
    public class EF7BenchMark
    {
        [Benchmark]
        public async Task RunAsync()
        {
            var builder = new DbContextOptionsBuilder();
            builder.UseModel(ApplicationDbContextModel.Instance);
            builder.EnableSensitiveDataLogging();
            builder.UseSqlServer("")
            .UseLoggerFactory(new LoggerFactory(new[] {
                    new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider()
            }));
            using (var context = new ApplicationDbContext(builder.Options))
            {
                var query = context.Customers.Where(x => !x.Deleted.HasValue);
                query = query.Where(x => x.PrimaryEmail == "[email protected]");
                query = query
                .Include(x => x.MyTmPermission)
                .Include(x => x.TmUserIds);

               query = query
                    .Include(x => x.CustomerProfiles).ThenInclude(x => x.Address)
                    .Include(x => x.CustomerProfiles).ThenInclude(x => x.Index)
                    .Include(x => x.CustomerProfiles).ThenInclude(x => x.CustomerValue);

                query = query.Include(x => x.ClassProfile).ThenInclude(x => x.Bags)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.ClubShaftLength)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.ClubShaftFlex)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.ClubCategoryType)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.FaceLoftAdjustment)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.FaceLieAdjustment)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.ClubLoft)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.ClubCategory)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.Brand)
                    .Include(x => x.ClassProfile.Bags)
                    .ThenInclude(x => x.Model);

                query = query.Include(x => x.ClassProfile.TimePlayingGolf)
                    .Include(x => x.ClassProfile.NewHandicap)
                    .Include(x => x.ClassProfile.CurrentIronLength)
                    .Include(x => x.ClassProfile.CurrentDriverFlex)
                    .Include(x => x.ClassProfile.DriverLoft)
                    .Include(x => x.ClassProfile.CurrentIronLie)
                    .Include(x => x.ClassProfile.DesiredDriverFlex)
                    .Include(x => x.ClassProfile.ClubHand);

                    var customer = await query.AsSplitQuery().AsNoTrackingWithIdentityResolution().FirstOrDefaultAsync();
            }
        }
    }

结果:

构建到 SQL 的查询与我使用 SQL Profiler 时相同。 我在性能上做错了什么?这是同一个查询。 我可以做些什么来提高 ef core 7.0.3 的性能?

performance asp.net-core optimization entity-framework-core include
© www.soinside.com 2019 - 2024. All rights reserved.