为什么我的EF模型的大小会极大地影响查询性能?

时间:2014-04-11 21:21:05

标签: entity-framework

首先使用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,现有的查询会因添加新表而受到惩罚)?

0 个答案:

没有答案