LINQ AsNoTracking 运行缓慢

3

我需要一个来自我的数据库的未编辑项目列表。

它运行得很慢,所以我试图增加一些速度。

因此,我在LINQ查询中添加了AsNoTracking,但运行速度更慢了!

以下代码平均需要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()应该更快,并且非常适合只读列表。 此外,此表有两个子表。


AsNoTracking 的位置不应该有影响。是否涉及到延迟加载?如果没有跟踪,由于 EF 无法重用先前获取的实体,这可能需要更多时间。 - Gert Arnold
@GertArnold,这里有两个子表。 - Ashley Kilgour
阅读此文:https://dotnetcultist.com/maximizing-entity-framework-core-query-performance/ - AlleXyS
但是当代码后面访问result时,它们实际上是否加载?你看到哪些查询在运行? - Gert Arnold
@AshleyKilgour,你找到正确的答案了吗? - Mateusz Kaleta
1个回答

0
第一次运行查询时,必须进行编译。如果实体已经被上下文跟踪,则跟踪查询将返回这些实例,而不是创建新的实例。
这就是为什么跟踪的实体可能比使用AsNoTracking()方法执行得更快的原因。

https://github.com/aspnet/EntityFrameworkCore/issues/14366

但是执行时间约为7秒,这表明它不是跟踪问题。这意味着数据库存在问题(例如未索引的列),如果数据集正确设置,则可以在30毫秒内获取大约15亿条记录,而不是几秒钟。


它不仅在第一次运行时速度慢,我运行了六次并计算了平均值,第一次读取并不慢。 - Ashley Kilgour
SalesOrderItems表中的SalesOrderId列是否为索引列?另外,SalesOrderItems表中包含多少条记录?您能提供从DataContext创建开始的整个代码吗? - Oleg Bondarenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接