批量操作可显著提升Entity Framework的性能
2017-10-16 14:29
330 查看
当数据库管理员考虑高性能数据加载时,他们会考虑批量操作,这明显是Entity Framework不具备的功能。但也不一定就是如此。近日,我们采访了ZZZ项目的Jonathan Magnan,谈了他们新提供的功能。
InfoQ:开发人员已经可以告诉Entity Framework将批量记录同时上传。那么为什么还需要批量操作呢?
Jonathan Magnan:很简单,为了获得巨大的性能。
想象一下,要求某人给你一本书,一次一页(Entity Framework),而不是给你整本书(批量操作)。一种技术明显比另一种技术更快:批量操作的性能要远远超过Entity Framework。
ZZZ项目通过Entity Framework扩展库提供两种批量操作。与Entity Framework的SaveChanges方法相比,它们极大地提供了性能。
BulkSaveChanges
第一种方式是我们的主要功能,正如字面上的意思,BulkSaveChanges方法升级了SaveChanges方法。当有成千上万个实体时,它的保存速度预计快10到15倍。该方法支持各种关联和实体类型(TPC、TPH和TPT)。
第二种方式是批量操作方法(BulkDelete、BulkInsert、BulkUpdate和BulkMerge)。它们对性能的提升更大,而且允许自定义许多设置,比如使用什么主键?
InfoQ:在底层的SQL方面,批量操作与普通的Entity Framework操作有何不同?
Jonathan:Entity Framework每保存一条记录就产生一次数据库访问。如果有1000个实体要更新,就需要访问数据库1000次,每次执行一条更新语句,整个过程可能需要几秒钟。另一方面,使用Entity Framework扩展库,一眨眼功夫就能完成。
我们可以像下面这样还原SQL Server的标准工作流程:
在SQL Server中创建一张临时表;
使用.NET SqlBulkCopy将数据批量插入临时表;
在临时表和目标表之间执行一条SQL语句;
从SQL Server删除临时表。
数据库访问次数明显减少。
InfoQ:你们针对Entity Framework做过基准测试比较普通操作和批量操作码?
Jonathan:基准测试显示了四舍五入后的数值,因为已经相当明显,批量操作总是一种比做多次操作更快的方式。
在记录数以百万计的场景中,批量操作是唯一可行的方案。与Entity Framework相比,其性能可以为开发人员节省数小时甚至几天的时间。
在真实环境的场景中,随着列数、索引、触发器和服务器负载的增加,Entity Framework与批量操作之间的性能差距甚至更大。
此外,速度不是唯一重要的因素,向SQL Server服务器发起成千上万次访问从来都不是一个好的解决方案。即使你的应用程序受此低性能的影响不大,但这可能会影响其它应用程序的性能。
InfoQ:批量操作有什么缺点?比如,要使它有效,有最小行数要求吗?
Jonathan:缺点是需要额外的启动加载。同Entity Framework一样,在第一次基于实体及其关系使用它时,需要收集并缓存信息。
甚至于只有一行数据时,它都可以同Entity Framework效果一样。它会根据需要保存的行数改变保存策略。
InfoQ:你们计划在CodePlex上将Entity Framework批量操作贡献给Entity Framework主干吗?
Jonathan:很遗憾,不会。SqlBulkCopy已经创建十年多了,.NET Framework仍然没有支持批量删除、更新和合并。我们提供了这些方法,我们的网站上有更多的功能。
InfoQ:您对微软将Entity Framework移交给.NET基金会有什么看法?
Jonathan: 我认为,微软此举意义重大,因为开源社区发展很快。作为一名程序员,看看微软项目的演进以及微软的开发人员如何编码总是很有趣的。这使经常使用Entity Framework的开发人员可以很简单地分享代码、建议和思路。这是我们希望的一次创新性转变, 一定会对微软和.NET社区产生积极的影响。
查看英文原文:Dramatically
Improve Entity Framework Performance with Bulk Operations
感谢孙镜涛对本文的审校。
原文出处:http://www.infoq.com/cn/news/2014/12/EF-Bulk-Operations?utm_source=infoq_en&utm_medium=link_on_en_item&utm_campaign=item_in_other_langs
InfoQ:开发人员已经可以告诉Entity Framework将批量记录同时上传。那么为什么还需要批量操作呢?
Jonathan Magnan:很简单,为了获得巨大的性能。
想象一下,要求某人给你一本书,一次一页(Entity Framework),而不是给你整本书(批量操作)。一种技术明显比另一种技术更快:批量操作的性能要远远超过Entity Framework。
ZZZ项目通过Entity Framework扩展库提供两种批量操作。与Entity Framework的SaveChanges方法相比,它们极大地提供了性能。
BulkSaveChanges
第一种方式是我们的主要功能,正如字面上的意思,BulkSaveChanges方法升级了SaveChanges方法。当有成千上万个实体时,它的保存速度预计快10到15倍。该方法支持各种关联和实体类型(TPC、TPH和TPT)。
using (var ctx = new DbContextEntities()) { //…对DbContext做任何修改… ctx.BulkSaveChanges(); }
第二种方式是批量操作方法(BulkDelete、BulkInsert、BulkUpdate和BulkMerge)。它们对性能的提升更大,而且允许自定义许多设置,比如使用什么主键?
using (var ctx = new DbContextEntities()) { //…对DbContext做任何修改… //使用Entity Framework设置 ctx.BulkUpdate(list); //或者自定义设置 ctx.BulkUpdate (list, operation=>operation.ColumnPrimaryKeyExpression=column=>column.ID); }
InfoQ:在底层的SQL方面,批量操作与普通的Entity Framework操作有何不同?
Jonathan:Entity Framework每保存一条记录就产生一次数据库访问。如果有1000个实体要更新,就需要访问数据库1000次,每次执行一条更新语句,整个过程可能需要几秒钟。另一方面,使用Entity Framework扩展库,一眨眼功夫就能完成。
我们可以像下面这样还原SQL Server的标准工作流程:
在SQL Server中创建一张临时表;
使用.NET SqlBulkCopy将数据批量插入临时表;
在临时表和目标表之间执行一条SQL语句;
从SQL Server删除临时表。
数据库访问次数明显减少。
InfoQ:你们针对Entity Framework做过基准测试比较普通操作和批量操作码?
Jonathan:基准测试显示了四舍五入后的数值,因为已经相当明显,批量操作总是一种比做多次操作更快的方式。
Nb.Entities | SaveChanges | BulkSaveChanges | BulkOperations |
1,000 | 1,000ms | 90ms | 70ms |
2,000 | 2,000ms | 150ms | 110ms |
5,000 | 5,000ms | 350ms | 220ms |
Nb. Entities | BulkSaveChanges | BulkOperations |
100,000 | 7s | 4.5s |
1,000,000 | 75s | 45s |
10,000,000 | 750s | 450s |
此外,速度不是唯一重要的因素,向SQL Server服务器发起成千上万次访问从来都不是一个好的解决方案。即使你的应用程序受此低性能的影响不大,但这可能会影响其它应用程序的性能。
InfoQ:批量操作有什么缺点?比如,要使它有效,有最小行数要求吗?
Jonathan:缺点是需要额外的启动加载。同Entity Framework一样,在第一次基于实体及其关系使用它时,需要收集并缓存信息。
甚至于只有一行数据时,它都可以同Entity Framework效果一样。它会根据需要保存的行数改变保存策略。
InfoQ:你们计划在CodePlex上将Entity Framework批量操作贡献给Entity Framework主干吗?
Jonathan:很遗憾,不会。SqlBulkCopy已经创建十年多了,.NET Framework仍然没有支持批量删除、更新和合并。我们提供了这些方法,我们的网站上有更多的功能。
InfoQ:您对微软将Entity Framework移交给.NET基金会有什么看法?
Jonathan: 我认为,微软此举意义重大,因为开源社区发展很快。作为一名程序员,看看微软项目的演进以及微软的开发人员如何编码总是很有趣的。这使经常使用Entity Framework的开发人员可以很简单地分享代码、建议和思路。这是我们希望的一次创新性转变, 一定会对微软和.NET社区产生积极的影响。
查看英文原文:Dramatically
Improve Entity Framework Performance with Bulk Operations
感谢孙镜涛对本文的审校。
原文出处:http://www.infoq.com/cn/news/2014/12/EF-Bulk-Operations?utm_source=infoq_en&utm_medium=link_on_en_item&utm_campaign=item_in_other_langs
相关文章推荐
- 批量操作可显著提升Entity Framework的性能
- 批量操作可显著提升Entity Framework的性能
- 详解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作
- redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作
- redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作
- 实验楼sql进阶之简化数据操作提升性能(window)
- .NET简谈互操作(五:基础知识之提升平台调用性能)
- 使用memcached显著提升站点性能
- 数据库性能优化三:程序操作优化提升性能
- PostgreSQL 10 正式版发布,显著的性能提升!
- 使用memcached显著提升站点性能
- String操作性能提升一
- .NET简谈互操作(六:基础知识之提升平台调用性能)
- .net中利用oracle产品自带的数据访问组件(Oracle.DataAccess.dll)提升批量更新操作的执行效率
- PLSQL批量Forall操作性能提升详解
- 操作技巧:将 Spark 中的文本转换为 Parquet 以提升性能
- ORACLE 大数据批量更新 MERGE INTO 代替 UPDATE/INSERT INTO 提升性能
- 11个显著提升 ASP.NET 应用程序性能的技巧——第1部分
- Oracle 性能优化—批量操作
- .NET简谈互操作(五:基础知识之提升平台调用性能)