情况介绍
在项目中,我用EF存储2W条数据时,花费竟然1小时20分钟左右,然后我只能……
测试草图
测试草图,仅供借鉴看,下面我会详细总结。
优化方法总结
1.连接保持畅通
意思是不要在需要的时候连接了不需要的时候断开,需要了又去连接(特殊情况除外),目的在于减少对数据库的操作。
2.关闭EF的一些配置
EF使用时,会在Config中配置,对于使用CRUD功能,有一些是用不到的,可以关闭,关闭后的测试效果加快几秒,略微提升。
检测对 POCO 实体的属性和关系所做的更改。 请注意,某些类型的实体(如更改跟踪代理和派生自 EntityObject 的实体)会自动报告更改,并且这些类型的实体通常不需要调用 DetectChanges。 另请注意,通常,DbContext 的许多方法及其相关类会自动调用 DetectChanges,这样一来,便很少需要显式调用此方法。 但通常出于性能原因,可能需要使用 Configuration 中的 AutoDetectChangesEnabled 标志来关闭对 DetectChanges 的自动调用。
3.存入List
EF支持AddRange,如果需要存5条数据,将这5条数据放入list一次存入,要比一条一条的存大大的快。
4.查找数据用Linq or Lamba
遇到这样的情况,你需要从数据库中取某一条特定的数据,然后处理这条数据后存入另一个表,用foreach是吧,太慢了,换成Linq,上面草图中有个备注,再换成lamba试试。
5.数据放入内存
如果要从一个表中多次找数据来使用,那不如第一步先将这个表中所有数据或者需要的那部分特征数据都先放入内存中,从内存中读取的速度,大大的快于操作数据库,而这目的,也就是减少操作数据库的次数,耗性能。
6.使用BulkInsert
使用插件Extended,使用其中的BulkSaveChanges代替EF原生态的SaveChanges来保存数据,附截图来引用一段话:
然后我亲测结果如图:
1000条数据,BulkSaveChanges花费1s,SaveChanges花费27s……
插件名:
对于该插件的一些使用方法,我也附上网址:
http://bulk-operations.net
7.使用SQL语句
如果你对速度还不满意,可以CRUD,直接使用SQL语句来操作。
可以参考:
http://www.cnblogs.com/LingzhiSun/archive/2011/04/15/EF_Trick2.html#2774378
8.多表只需存一张
遇到这样的情况,P、T两张表,关系是1—–(0,1)的关系,你可能会先存入P表的数据,然后foreach P表的数据,找到对应的给T表的导航属性赋值,然后存入这条数据到T表,这个问题很严重也可笑,但是我身上缺犯了,只需要存 必须存导航数据(T表数据),有关联的表数据自然存入了(P表)
结尾
上述我总结的方法中,没有使用SQL语句,原先花费1小时20分钟的事,现在花费70s,竟然真的做到了。