我需要来 self 的数据库的未经编辑的项目列表。 它运行缓慢,所以我试图加快速度。
所以我将 AsNoTracking 添加到 LINQ 查询中,它运行得更慢了!
以下代码平均耗时 7.43 秒。 AsNoTracking 位于之后 Where
var result = await _context.SalesOrderItems.Where(x => x.SalesOrderId == SalesOrderId ).AsNoTracking().ToListAsync();
以下代码平均耗时 8.62 秒。 AsNoTracking 在 Where 之前
var result = await _context.SalesOrderItems.AsNoTracking().Where(x => x.SalesOrderId == SalesOrderId ).ToListAsync();
以下代码平均耗时 6.95 秒。没有 AsNoTracking
var result = await _context.SalesOrderItems.Where(x => x.SalesOrderId == SalesOrderId ).ToListAsync();
所以我错过了什么吗?我一直认为 AsNoTracking() 应该运行得更快,并且是只读列表的理想选择。 此表还有两个子表。
最佳答案
The first time a query is run it must be compiled. If entities are already tracked by the context, then a tracking query will return those instances rather than creating new.
这就是为什么被跟踪的实体可能比使用 AsNoTracking() 执行得更快的原因。
https://github.com/aspnet/EntityFrameworkCore/issues/14366
但是大约 7 秒的执行时间表明它没有问题/没有跟踪。这意味着数据库有问题(例如,不是索引列),如果数据设置正确,大约 15 亿条记录会在 30 毫升但几秒钟内得到。
https://stackoverflow.com/questions/56492628/