Performance 用EF加载一个巨大的实体树

Performance 用EF加载一个巨大的实体树,performance,entity-framework,mapping,Performance,Entity Framework,Mapping,我需要加载一个模型,现有的+/-20表从数据库实体框架 因此,可能有几种方法可以做到这一点: 使用一个巨大的包含呼叫 在手动迭代模型时使用许多include调用 使用许多IsLoaded和Load调用 下面是这两个选项的结果 EF创建了一个巨大的查询,给数据库带来了非常沉重的负载,然后再次映射模型。所以这不是一个真正的选择 数据库经常被调用,查询量也很大 同样,数据库被调用的次数更多,但这一次的负载很小 所有这些选项都会对性能产生重大影响。我确实需要为绘图加载所有数据计算 那我该怎么办 重操作=

我需要加载一个模型,现有的+/-20表从数据库实体框架

因此,可能有几种方法可以做到这一点:

使用一个巨大的包含呼叫 在手动迭代模型时使用许多include调用 使用许多IsLoaded和Load调用 下面是这两个选项的结果

EF创建了一个巨大的查询,给数据库带来了非常沉重的负载,然后再次映射模型。所以这不是一个真正的选择

数据库经常被调用,查询量也很大

同样,数据库被调用的次数更多,但这一次的负载很小

所有这些选项都会对性能产生重大影响。我确实需要为绘图加载所有数据计算

那我该怎么办

重操作=>重负载=>什么也不做: b审查设计=>但如何审查?
c是一个神奇的选项,可以消除所有这些问题当您需要从缺少不同表的情况下加载大量数据时,没有神奇的解决方案可以消除所有问题。但是除了你已经讨论过的,你还应该考虑投影。如果您不需要实体的每一个属性,则通常可以更便宜地投影您确实需要的信息,即:

from parent in MyEntities.Parents
select new
{
    ParentName = ParentName,
    Children = from child in parent.Children
               select new
               {
                   ChildName = child.Name
               }
}

要记住的另一件事是,对于非常大的查询,编译查询的成本通常会超过执行查询的成本。只有分析才能告诉您这是否是问题所在。如果这是问题,请考虑使用CopyDeQual.

< P>,您可以分析查询与更新的比例。如果您只上传一次模型,那么其他所有内容都是查询,那么您可能应该在数据库中存储模型的XML表示,作为模型的阴影。您应该能够相当快地一次读入整个XML列,或者您可以进行计算,或者至少可以使用XQuery获取计算所需的值


假定SQL Server 2005或以上。

< P>可以考虑将数据缓存在内存中,而不是每次从数据库中获取数据。
我建议企业库缓存应用程序块:

我需要进行CAD计算,这涉及到访问特定节点下的一大块模型。要知道特定项目在图纸上的位置,我需要知道它的父项在哪里,还需要知道它的类型和特征。这个逻辑适用于树中的所有项。。。这有意义吗?如果不是的话,我再解释一点:现在很有道理了-是的,我记得你以前关于投影的建议。但是,创建此模型的投影本身并不容易。另外,这也是一个很大的体系结构,所以我有点担心在使用这种方法时可能会出现新的问题。此时编译的成本实际上也是一个非常漫长的操作,因此我肯定会研究CompiledQuery选项。谢谢