实体框架(v4及更高版本)如何执行大规模(100万行)查询?

时间:2014-08-10 12:23:55

标签: c# entity-framework entity-framework-4

我目前正在探索使用Entity框架来开发基于Windows的(窗体)应用程序我正在开发的数据挖掘超过100万行的数据集(我的数据源来自oracle,sql server,sqlite)。应用程序将做的是将这些信息解析给用户本地客户端,并在利用linq对象挖掘有用信息。所述应用程序只应将信息读取到源数据库,因为其输出将写入excel文件中。

鉴于在减少开发时间方面使用Entity Framework非常容易(这是我第一次使用ORM,并且根据之前的项目编写必要的数据访问对象占用了大约80%的时间我以前做过),我想问一下将EntityFramework用于我正在使用的应用程序是否值得?在读取超过100万行的表时,性能下降(与使用DataReader相比)会有多少?

另外,鉴于我是这项技术的新手,如果您能够向我推荐有用的教程和最佳实践,我将非常感激。

2 个答案:

答案 0 :(得分:2)

使用纯ADO.NET将为您提供实际上最佳的性能。但请记住,从数据源获取数据后,您仍需要将结果映射到对象模型(由EF自动完成),以便您可以执行实际的数据挖掘。

根据您的数据模型的复杂程度,映射可能很难或很容易。例如,实体框架擅长映射分层数据结构,这在获取相关实体(甚至其相关实体)以及实际实体时非常有用。 您还应该考虑数据模型的更改频率(以及这些更改的大小),因此您也要计算可维护性成本。每次添加新列时都需要更改大量SQL,这是另一个遇到问题的方法。在这种情况下,使用POCO维护EF模型会更容易,更方便。

请注意,其他O / RM 可以为您提供两种世界中最好的一种(DataReader的性能和轻松映射到Entity Framework的POCO)。其中包括:NPoco(前PetaPoco),Dapper(StackOverflow使用的),NHibernate(使用HQL可以非常快),OrmLite(具有基本的LINQ类查询支持)和许多其他。 看看Dapper的performance benchmarks results,它可能会让您了解流行的O / RM可以达到的性能。

获取数据技术的性能实际上取决于数据库中的数据模型。 这就是为什么它重要不仅要分析现有基准,还要根据您数据模型上的特定用例执行自己的基准测试。作为起点,您可以抓住Dapper的performance tests code并根据您的需求进行调整(数据模型,典型查询等),以便您使用不同的框架获得更全面,更真实的性能结果。 / p>

答案 1 :(得分:1)

EF永远不会像使用带有OracleCommand raw ADO.NET一样快。毕竟,EF是ADO.NET之上的另一层;它的主要目标是为程序员提供便利功能,将原始列映射到字段和行到对象中。

如果您需要绝对的顶级性能,那么您需要使用原始ADO.NET。这样做的缺点是你需要开始摆弄无类型的行和列。

没有免费的午餐 - 要么是性能最好,要么是令人不快的编程API,要么以性价格获得便利和生产力。