BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

批量操作可显著提升Entity Framework的性能

| 作者 Jonathan Allen 关注 594 他的粉丝 ,译者 谢丽 关注 11 他的粉丝 发布于 2014年12月12日. 估计阅读时间: 7 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

当数据库管理员考虑高性能数据加载时,他们会考虑批量操作,这明显是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)。

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

在记录数以百万计的场景中,批量操作是唯一可行的方案。与Entity Framework相比,其性能可以为开发人员节省数小时甚至几天的时间。

Nb. Entities

BulkSaveChanges

BulkOperations

100,000

7s

4.5s

1,000,000

75s

45s

10,000,000

750s

450s

在真实环境的场景中,随着列数、索引、触发器和服务器负载的增加,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


感谢孙镜涛对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT