处理大量记录(> 35 mlns)的实体

问题描述:

我们有一组相关表格,每个表格有超过3500万条相关记录。我需要创建一些WCF方法,用一些参数(数据范围,类型代码等)查询数据库并返回相关结果集(从10到10,000条记录)。处理大量记录(> 35 mlns)的实体

该公司是在EF 4.0上标准化的,但对于4.X开放。我可能会将参数迁移到5.0,但不太可能。

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

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

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

+0

你打算如何处理10000个返回的实体? – Pawel

我与EF4.1经验,代码首先:如果你只需要读取记录(即你不会把它们写回),你会被改变的转动你的背景下跟踪获得的性能提升:

yourDbContext.Configuration.AutoDetectChangesEnabled = false; 

在加载任何实体之前执行此操作。如果您需要更新加载的记录,您可以拨打

yourDbContext.ChangeTracker.DetectChanges(); 

在调用SaveChanges()之前。

在我的工作中,我面临着类似的情况。我们有一个有很多表格的数据库,其中大多数都包含大约7千万条记录。我们使用Entity框架来显示数据,但页面似乎显示非常慢(如90到100秒)。即使在电网上排序也需要时间。我被赋予了任务,看看它是否可以优化。 (ANTS分析器),我能够优化它(7秒以下)。

所以答案是是,实体框架能够处理的记录负载(百万),但一些必须注意

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

如果你记住这些事情,EF应该给出与普通ADO.NET几乎相似的性能,如果不相同的话。

当我听到类似这样的声明:“该公司是EF4或EF5标准化的,或任何其他”这使我的脊柱冷颤。

这相当于汽车租赁“我们已经标准化了我们整个车队的单一车型”。

还是一个木匠说:“我已经标准化了凿子作为我的整个工具包。我不会有锯,钻等...”

有一种叫做合适的工作 这种说法正确的工具而已突出显示负责制定关键软件体系结构决策的人员不知道软件体系结构。

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

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

如果答案仍然是,您需要将所有100K记录加载到内存中并执行操作。那么也许你需要考虑一些其他的东西,比如像轻量级对象的定制缓存。也许延迟加载嵌套对象的动态对象指针。等等......我使用类似这样的一个实例是电子商务网站的大型产品目录,其中针对目录执行了大量搜索。为什么要提供自定义行为,如提前退出搜索和使用预编译正则表达式的正则表达式通配符搜索或自定义哈希表索引放入产品目录。

这个问题没有一个答案。这完全取决于数据使用场景以及应用程序如何处理数据。考虑大猩猩VS鲨鱼谁会赢?这完全取决于环境和环境。

也许EF6非常适合从动态反射中受益的一块,而NetTiers对于需要静态反射和可扩展ORM的另一块更好。虽然低水平的ADO可能是最适合高性能部件的最佳选择。