Entity framework 4 实体,处理大量记录(>;3500万条)

Entity framework 4 实体,处理大量记录(>;3500万条),entity-framework-4,entity-framework-4.1,entity,entity-framework-5,Entity Framework 4,Entity Framework 4.1,Entity,Entity Framework 5,我们有一组相当大的相关表,每个表都有超过3500万条相关记录。我需要创建两个WCF方法,用一些参数(数据范围、类型代码等)查询数据库,并返回相关的结果集(10到10000条记录) 该公司在EF4.0标准化,但对4.X开放。我也许可以提出迁移到5.0的理由,但可能性不大 使用实体处理如此大量的记录的最佳方法是什么?我应该创建一组存储过程并从实体调用它们,还是可以在实体中执行某些操作 我对数据库没有任何控制权,因此无法拆分表或创建一些物化视图或分区表 非常感谢您的任何输入/想法/建议。我对EF4.1

我们有一组相当大的相关表,每个表都有超过3500万条相关记录。我需要创建两个WCF方法,用一些参数(数据范围、类型代码等)查询数据库,并返回相关的结果集(10到10000条记录)

该公司在EF4.0标准化,但对4.X开放。我也许可以提出迁移到5.0的理由,但可能性不大

使用实体处理如此大量的记录的最佳方法是什么?我应该创建一组存储过程并从实体调用它们,还是可以在实体中执行某些操作

我对数据库没有任何控制权,因此无法拆分表或创建一些物化视图或分区表


非常感谢您的任何输入/想法/建议。

我对EF4.1的经验,代码优先:如果您只需要阅读记录(即,您不会将其写回),您将通过针对您的上下文启用更改跟踪来获得性能提升:

yourDbContext.Configuration.AutoDetectChangesEnabled = false;
在加载任何实体之前执行此操作。如果需要更新加载的记录,可以随时调用

yourDbContext.ChangeTracker.DetectChanges();

在工作中调用SaveChanges()之前,我遇到了类似的情况。我们有一个包含许多表的数据库,其中大多数表都包含大约700-1000万条记录。我们使用实体框架来显示数据,但页面显示速度似乎非常慢(比如90到100秒)。甚至网格上的排序也需要时间。我的任务是看它是否可以优化。在分析完它之后(ANTS profiler),我能够优化它(在7秒内)

因此答案是是的,实体框架可以处理大量的记录(以百万计),但必须注意

  • 理解只有在需要实际记录时才调用数据库。所有操作都只是用于进行查询(SQL),因此请尝试仅获取一段数据,而不是请求大量记录。尽可能地修剪提取大小
  • 是的,您不应该这样做,您必须使用存储过程并将它们导入到您的模型中,并为它们进行函数导入。您也可以直接调用它们ExecuteStoreCommand(),ExecuteStoreQuery()。Sames适用于函数和视图,但EF调用函数“SELECT dbo.blah(@id)”的方式非常奇怪
  • 当EF必须用深层层次结构填充实体时,执行速度较慢。对于层次结构较深的实体,要格外小心
  • 有时,当您请求记录而不需要修改记录时,您应该告诉EF不要监视属性更改(AutoDetectChanges)。这样,记录检索速度就快多了
  • 数据库的索引很好,但在EF的情况下,它变得非常重要。用于检索和排序的列应正确编制索引
  • 当您的模型很大时,VS2010/VS2012模型设计器会变得非常疯狂。所以把你的模型分成中等大小的模型。存在一个限制,即来自不同模型的实体不能共享,即使它们可能指向数据库中的同一个表
  • 当您必须在不同位置对同一实体进行更改时,请尝试通过传递同一实体并仅发送一次更改来使用该实体,而不是每次都获取一个新的片段、进行更改并存储它(真正的性能增益提示)
  • 当您只需要一列或两列中的信息时,请尝试不获取完整的实体。您可以直接执行sql,也可以使用小型实体。您可能还需要在应用程序中缓存一些常用数据
  • 交易很慢。小心他们

  • 如果你记住这些,EF应该提供与普通ADO.NET几乎相同的性能,如果不是相同的话。

    当我听到诸如“公司在EF4或EF5上实现了标准化”之类的言论时,这让我不寒而栗

    这相当于租车公司说“我们已经为我们的整个车队标准化了单一车型”

    或者一个木匠说:“我已经把凿子作为我的全部工具进行了标准化,我不会使用锯子、钻头等。”

    对于正确的工作,有一种叫做正确的工具 此声明仅强调负责制定关键软件体系结构决策的人员对软件体系结构一无所知

    如果您处理的记录超过10万条,并且数据模型非常复杂(即非常复杂),那么EF6可能不是最佳选择。 EF6基于动态反射的概念,具有与Castle项目活动记录类似的设计模式

    是否需要将所有100K记录加载到内存中并对其执行操作?如果是,问问你自己,你真的需要这样做吗?为什么不跨100K条记录执行一个存储过程来达到同样的效果呢。进行一些分析,看看实际的数据使用模式是什么。也许用户执行的搜索返回了100K条记录,但他们只浏览了前200条记录。例如谷歌搜索,几乎没有人浏览数百万搜索结果中的第3页

    如果答案仍然是“是”,则需要将所有100K记录加载到内存中并执行操作。那么也许你需要考虑一些其他东西,比如一个定制的有轻量级对象的写高速缓存。可能延迟加载嵌套对象的动态对象指针。等我使用的一个例子是电子商务站点的大型产品目录,其中针对目录执行了大量搜索。Why is是为了提供自定义行为,例如使用预编译的regex进行早期退出搜索和regex通配符搜索,或者在产品目录中提供自定义哈希表索引

    这个问题没有一刀切的答案。这完全取决于数据使用场景以及应用程序如何处理数据。想想大猩猩vs鲨鱼谁会赢?这完全取决于我所处的环境