EF大数据批量添加性能问题

前几天做一个批量发消息的功能,因为要向消息表中批量写入数据,用的EF框架的插入方法;不用不知道,一用吓一跳;就10000条数据就耗时好几分钟,对应追求用户体验的我来说这是极不能容忍的,后来改为拼接SQL,性能提高了好几倍;现在来分享一下经验:

原始的方法类似这种:

 1         public ActionResult Add(ItemDetails entity)
 2         {
 3             var sw = new Stopwatch();
 4             sw.Start();
 5             using (db)
 6             {
 7                 for (var i = 0; i < 10000; i++)
 8                 {
 9                     db.ItemDetails.Add(entity);
10                     db.SaveChanges();
11                 }
12             }
13             sw.Stop();
14             var date = sw.Elapsed;
15             return Json(string.Format("总耗时:{0}", date));
16         }

来看看添加10000条数据耗时:

就10000条数据就耗时这么久,要是上百万的数据量,那简直就不能想象,再来看看优化后的:

生成SQL的方法:

 1 public class ItemDetailBatch
 2     {
 3         public static string BatchAdd(ItemDetails entity)
 4         {
 5             SqlParameter [] paras=
 6             {
 7                 new SqlParameter("@Item_Name",SqlDbType.VarChar,100),
 8                 new SqlParameter("@Item_Price",SqlDbType.Int),
 9                 new SqlParameter("@Image_Name",SqlDbType.VarChar,100),
10                 new SqlParameter("@Description",SqlDbType.VarChar,100),
11                 new SqlParameter("@AddedBy",SqlDbType.VarChar,100)
12             };
13             paras[0] .Value= entity.Item_Name;
14             paras[1].Value = entity.Item_Price;
15             paras[2].Value = entity.Image_Name;
16             paras[3].Value = entity.Description;
17             paras[4].Value = entity.AddedBy;
18             var sb=new StringBuilder();
19             sb.Append("insert into ItemDetails (Item_Name,Item_Price,Image_Name,Description,AddedBy) ");
20             sb.AppendFormat("values (‘{0}‘,{1},‘{2}‘,‘{3}‘,‘{4}‘)", paras[0].Value, paras[1].Value, paras[2].Value,paras[3].Value, paras[4].Value);
21             return sb.ToString();
22         }
23     }

Controller层调用:

 1         public ActionResult Add(ItemDetails entity)
 2         {
 3             var sw = new Stopwatch();
 4             sw.Start();
 5             using (var db = new ShoppingDBConn())
 6             {
 7                 var sql = new StringBuilder();
 8                 for (int i = 0; i < 10000; i++)
 9                 {
10                     //生成SQL
11                     sql.Append(ItemDetailBatch.BatchAdd(entity));
12                 }
13                 //一次性执行SQL
14                 db.Database.ExecuteSqlCommand(sql.ToString());
15             }
16             sw.Stop();
17             var date = sw.Elapsed;
18             return Json(string.Format("总耗时:{0}", date));
19         }

界面数据:

同样10000条总耗时:

EF没添加一次都要向数据库提交一次,而直接拼接SQL的方法就是减少与数据库的交互次数,一次性提交执行所有数据;

时间: 2024-10-10 05:03:59

EF大数据批量添加性能问题的相关文章

C#中几种数据库的大数据批量插入

C#语言中对SqlServer.Oracle.SQLite和MySql中的数据批量插入是支持的,不过Oracle需要使用Orace.DataAccess驱动. IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider.批量插入的实现可以通过实现该接口来实现. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatcherProvider : IProviderServic

几种数据库的大数据批量插入

IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatcherProvider : IProviderService { /// <summary> /// 将 <see cref="DataTable"/> 的数据批量插入到数据库中.

C# 几种数据库的大数据批量插入

转载:http://www.cnblogs.com/luluping/archive/2012/08/09/2629515.html 在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法. 首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summ

C#:几种数据库的大数据批量插入 - faib

在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法. 首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatch

几种数据库的大数据批量插入【转】

在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法. 首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatch

分享MSSQL、MySql、Oracle的大数据批量导入方法及编程手法细节

1:MSSQL SQL语法篇: BULK INSERT [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ] FROM 'data_file' [ WITH ( [ [ , ] BATCHSIZE = batch_size ] [ [ , ] CHECK_CONSTRAINTS ] [ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_pag

java,大数据批量插入、更新

public void exec(Connection conn){ try { conn.setAutoCommit(false); Long beginTime = System.currentTimeMillis(); //构造预处理statement PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)"); //1万次循环 for(int i=1;i<=100000;i+

大数据批量插入数据库使用(SqlBulkCopy )效率更高

SqlBulkCopy类是System.Data.SqlClient下的类,我们开发中不常用,甚至不知道有这么一个类的存在,但确实比sql插入,事务批量插入,sql批量拼接插入快很多,比调用存储过程插入方便 下面是它的用法: public static bool ExecuteTransactionScopeInsert(DataTable dt, int batchSize) { int count = dt.Rows.Count; string tableName = "TestTable&

mysql在大数据量下性能调优相关参数

摘自http://blog.csdn.net/nightelve/article/details/17393631 一.thread_concurrency,默认的8 thread_concurrency的值的正确与否, 对mysql的性能影响很大, 在多个cpu(或多核)的情况下,错误设置了thread_concurrency的值, 会导致mysql不能充分利用多cpu(或多核), 出现同一时刻只能一个cpu(或核)在工作的情况.thread_concurrency应设为CPU核数的2倍. 比