首先使用EF 6.1数据库和模型。如果不考虑范围模型的优点或缺点,我想知道发生了什么。如果我在仅包含查询中的实体/表的模型上运行完全相同的查询与包含所有实体/表的模型相比(假设延迟加载已关闭),则两个查询应该花费相同的时间来执行。
逻辑上唯一的区别应该是具有查询所有实体能力的模型/对象将具有处理所有实体的所有代码的额外开销。一个较重的类,但它不应该影响查询性能。
以下是查询:
using ( var context = new MyEntities() )
{
context.Configuration.LazyLoadingEnabled = false;
var parentIds = new List<int> { 1, 2 };
var entities = ( from e in context.Entities.Include( "SomeRelatedEntity" )
join eParent in context.Parents on e.ParentId equals eParent.Id
where parentIds.Contains( eParent.Id )
select e )
.ToList();
}
使用完整模型,这需要花费2倍多才能获得80K实体。当针对完整模型运行时,在使用ToList执行该行时,它会在那里停留10秒钟,然后才能访问数据库!
如果我在每个实体设置后添加对.AsNoTracking()的调用,则滞后会消失。
如果我使用反向工程代码使用相同的大型模型运行相同的查询,则需要花费更多时间。毫无疑问,这是由于跟踪代理生成(至少它是有道理的)。
为什么EF花费这么长时间来执行被跟踪实体的查询?我有什么办法可以加快速度吗?这怎么可能不是一个错误(没有任何DBMS,现有的查询会因添加新表而受到惩罚)?