[转]How to Improve Entity Framework Add Performance?
本文转自:http://entityframework.net/improve-ef-add-performance
When you overuse the Add() method for multiple entities, your application suffers from performance issues.
using (var ctx = new CustomerContext())
{
foreach(var line in lines)
{
var customer = new Customer();
// ...code...
ctx.Customers.Add(customer);
}
ctx.SaveChanges();
}
StackOverflow Related Questions
Answer
Is Entity Framework Add Really Slow?
In fact, the Add method is not slow at all. Adding an entity to a list cannot be that slow. It's the DetectChanges method invoked inside the Add method which is insanely slow!
Using the Add method in a loop is usually a poor practice which impacts your application performance severely when poorly used.
- USE AddRange over Add (Recommended)
- SET AutoDetectChanges to false
- SPLIT SaveChanges in multiple batches
Use AddRange over Add (Recommended)
When adding multiple entities, you should always use Entity Framework AddRange once with a list instead of calling multiple time the Add method.
Why?
- The Add method DetectChanges after every records added.
- The AddRange method DetectChanges after all records are added.
Performance Comparisons
| Operations | 100 Entities | 1,000 Entities | 10,000 Entities |
|---|---|---|---|
| Add | 15 ms | 1,050 ms | 105,000 ms |
| AddRange | 1 ms | 10 ms | 120 ms |
Note:
- *: SaveChanges time not included
- **: Entity with two relations
How?
- CREATE a list
- ADD entity to the list
- USE AddRange with the list
- SaveChanges
- Done!
using (var context = new EntityContext())
{
// 1. CREATE a list
List<Customer> list = new List<Customer>();
for(int i = 0; i < 2000; i++)
{
var customer = new Customer();
// ...code...
// 2. ADD entity to the list
list.Add(customer);
}
// 3. USE AddRange with the list
context.Customers.AddRange(list);
// 4. SaveChanges
ctx.SaveChanges();
// 5. Done!
}
SET AutoDetectChanges to false
When adding multiple entities, if you cannot use AddRange, set Entity Framework AutoDetectChanges to false
Why?
- The Add method DetectChanges after every records added.
By disabling AutoDetectChanges, the DetectChanges method will only be invoked when you do it.
Performance Comparisons
| Operations | 100 Entities | 1,000 Entities | 10,000 Entities |
|---|---|---|---|
| True (Default) | 15 ms | 1,050 ms | 105,000 ms |
| False | 1 ms | 14 ms | 180 ms |
Note:
- *: SaveChanges time not included
- **: Entity with two relations
How?
- SET AutoDetectChangesEnabled = false
- CALL DetectChanges before SaveChanges
- SaveChanges
- Done!
using (var context = new EntityContext())
{
// 1. SET AutoDetectChangesEnabled = false
context.Configuration.AutoDetectChangesEnabled = false;
List<Customer> list = new List<Customer>();
for(int i = 0; i < 2000; i++)
{
var customer = new Customer();
// ...code...
list.Add(customer);
}
context.Customers.AddRange(list);
// 2. CALL DetectChanges before SaveChanges
context.ChangeTracker.DetectChanges();
// 3. SaveChanges
context.SaveChanges();
// 4. Done!
}
SPLIT SaveChanges into multiple batches
This solution is not recommended. When adding multiple entities, split entities with a batch size in multiple different contexts.
Why?
More tracking entities your context contains, slower the DetectChanges method is! So by reducing the number of entities by context, you improve the performance.
Performance Comparisons
| Operations | 100 Entities | 1,000 Entities | 10,000 Entities |
|---|---|---|---|
| Unlimited | 15 ms | 1,050 ms | 105,000 ms |
| 10 | 3 ms | 40 ms | 350 ms |
| 100 | 15 ms | 125 ms | 1,200 ms |
| 1,000 | 15 ms | 1,050 ms | 10,200 ms |
Note:
- *: SaveChanges time not included
- **: Entity with two relations
How
- CREATE a batchSize variable
- CALL SaveChanges before creating a new batch
- CALL SaveChanges
- Done!
// 1. CREATE a batchSize variable
int batchSize = 400;
var context = new EntityContext();
for(int i = 0; i <= 2000; i++)
{
// 2. CALL SaveChanges before creating a new batch
if (i != 0 && i%batchSize == 0)
{
context.SaveChanges();
context = new EntityContext();
}
var customer = new Customer();
// ...code...
context.Customers.Add(customer);
}
// 3. CALL SaveChanges
context.SaveChanges();
// 4. Done!
[转]How to Improve Entity Framework Add Performance?的更多相关文章
- [2014-09-18]Entity Framework 6 预热、启动优化
好久没写博客了,终于憋出了一个大招,现在总结下. 虽然文章题目是针对EF的,但涉及的内容不仅仅是EF. 场景介绍 目前在做的一个项目,行业门户,项目部分站点按域名划分如下: user.xxx.com: ...
- Access MongoDB Data with Entity Framework 6
This article shows how to access MongoDB data using an Entity Framework code-first approach. Entity ...
- Entity Framework 6 预热、启动优化
虽然文章题目是针对EF的,但涉及的内容不仅仅是EF. 场景介绍 目前在做的一个项目,行业门户,项目部分站点按域名划分如下: user.xxx.com:用户登陆注册 owner.xxx.com:个人用户 ...
- Performance Considerations for Entity Framework 4, 5, and 6
Performance Considerations for Entity Framework 4, 5, and 6 https://msdn.microsoft.com/en-sg/data/hh ...
- [XAF] How to improve the application's performance
[自己的解决方案]数据量大时,可显著提升用户使用体验! 1.Root ListView 参考官方的E1554 点击导航菜单后首先跳出查询条件设置窗体进行设置 可设置查询方案或查询方案的查询条件,排序字 ...
- Why you should use async tasks in .NET 4.5 and Entity Framework 6
Improve response times and handle more users with parallel processing Building a web application usi ...
- Entity Framework与ADO.NET批量插入数据性能测试
Entity Framework是.NET平台下的一种简单易用的ORM框架,它既便于Domain Model和持久层的OO设计,也提高了代码的可维护性.但在使用中发现,有几类业务场景是EF不太擅长的, ...
- Code First :使用Entity. Framework编程(8) ----转发 收藏
第8章 Code First将走向哪里? So far, this book has covered all of the Code First components that reached the ...
- Code First :使用Entity. Framework编程(7) ----转发 收藏
第7章 高级概念 The Code First modeling functionality that you have seen so far should be enough to get you ...
随机推荐
- Linux 第五天
网络命令 1)write 给在线用户发信息(需按Crtl+D保存结束,w命令可看在线用户) 语法:write 用户名 2)wall 发广播信息 英文原意:write all 语法:wall 信息 3) ...
- mysql 地理位置定位
SET @pt2 = ST_GeomFromText('POINT(116.405289 39.904987)'); SELECT *,ST_Distance_Sphere(ST_GeomFromTe ...
- fly插件飞向购物车
首先载入jQuery库文件和jquery.fly.min.js插件. 插件官方: https://github.com/amibug/fly, 官方例子: http://codepen.io/hzxs ...
- python实现netcat部分功能源代码
#!/opt/local/bin/python2.7 import sys import socket import getopt import threading import subprocess ...
- input标签之外是否一定添加form标签
原文转载自:https://blog.csdn.net/lamanchas/article/details/78753031 input标签外是否添加form标签需要按情形区分:应用场景的区别:1.所 ...
- shell脚本学习- 传递参数
跟着RUNOOB网站的教程学习的笔记 我们可以在执行shell脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n代表一个数字,1为执行脚本的第一参数,2为执行脚本的第二个参数,以此类推... 实 ...
- java基础-三元运算符
1.三元运算符的格式 /* 三元运算符 (条件表达式)?表达式1:表达式2; 如果条件为true,整个表达式结果是表达式1: 如果条件为false,整个表达式结果是表达式2: 注意:三元运算符不能单独 ...
- 关于SGA中的granule size
1.什么是granule? granule直译为颗粒,ORACLE为SGA 中的组件(eg:log buffer/db buffer/large pool等)分配的最小单元为一个granule. 所以 ...
- 1.Spring框架入门案例
一.简单入门案例 入门案例:IoC 1.项目创建与结构 2.接口与实现类 User.java接口 package com.jd.ioc; /** * @author weihu * @date 201 ...
- maya2017卸载/安装失败/如何彻底卸载清除干净maya2017注册表和文件的方法
maya2017提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装maya2017失败提示maya2017安装未完成,某些产品无法安装,也有时候想重新安装maya ...