海量数据插入数据库效率对比测试 ---ADO.NET下SqlBulkCopy()对比LINQ 下InsertAllOnSubmit()
2014-11-07 10:48
567 查看
摘要:使用.NET相关技术向数据库中插入海量数据是常用操作。本文对比ADO.NET和LINQ两种技术,分别使用SqlBulkCopy()和InsertAllOnSubmit()方法进行操作。得出结论:相同插入工作量(1w条数据)插入效率相差200倍之巨!
测试场景:
准备两个数据库TestDb和TestDb2,有表:T_Users。表结构如下图所示:
SqlBulkCopy()插入方法如下:
LINQ插入方法如下所示:
使用上述代码分别导入1万条User数据进入数据库。
得到结果如下图所示:
相同插入工作量(1w条数据)前提下,结论:
1 ADO.NET下SqlBulkCopy()方法是LINQ TO SQL下InsertAllOnSubmit()方法插入效率相差266倍之巨!
2 LINQ使用便捷、代码简短、学习成本低,语言表达优雅;但是,如果对效率要求较高的海量数据相关操作优先推荐使用ADO.NET方法。
注意事项:
如果在导入数据过程中提示“超时相关操作”,请在WriteToServer()方法前加入如下代码:
BulkCopyTimeout为超时上限秒数。
相关源码下载地址:http://download.csdn.net/detail/fanrong1985/8130953
测试场景:
准备两个数据库TestDb和TestDb2,有表:T_Users。表结构如下图所示:
SqlBulkCopy()插入方法如下:
private static Stopwatch InsertUsingSqlBulkCopy(List<UserInMemory> list) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); DataTable dt = new DataTable(); dt.Columns.Add("ID"); dt.Columns.Add("UserName"); for (int i = 0; i < list.Count; i++) { DataRow row = dt.NewRow(); row["ID"] = list[i].ID; row["UserName"] = list[i].UserName; dt.Rows.Add(row); } using (SqlConnection con = new SqlConnection(connStr2)) { con.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con)) { try { bulkCopy.DestinationTableName = "dbo.T_UserName"; bulkCopy.ColumnMappings.Add("ID", "ID"); bulkCopy.ColumnMappings.Add("UserName", "UserName"); bulkCopy.WriteToServer(dt); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } finally { con.Close(); } } } stopWatch.Stop(); return stopWatch; }
LINQ插入方法如下所示:
private static Stopwatch InsertUsingLINQ(List<T_User> _list) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); DataClasses1DataContext dataContext = new DataClasses1DataContext(); dataContext.T_Users.InsertAllOnSubmit(_list); dataContext.SubmitChanges(); stopWatch.Stop(); return stopWatch; }
使用上述代码分别导入1万条User数据进入数据库。
得到结果如下图所示:
相同插入工作量(1w条数据)前提下,结论:
1 ADO.NET下SqlBulkCopy()方法是LINQ TO SQL下InsertAllOnSubmit()方法插入效率相差266倍之巨!
2 LINQ使用便捷、代码简短、学习成本低,语言表达优雅;但是,如果对效率要求较高的海量数据相关操作优先推荐使用ADO.NET方法。
注意事项:
如果在导入数据过程中提示“超时相关操作”,请在WriteToServer()方法前加入如下代码:
bulkCopy.BulkCopyTimeout = 3600; bulkCopy.BatchSize = 3000; bulkCopy.WriteToServer(dt);BatchSize为每次传输数量的设置。
BulkCopyTimeout为超时上限秒数。
相关源码下载地址:http://download.csdn.net/detail/fanrong1985/8130953
相关文章推荐
- 海量数据插入数据库效率对照測试 ---ADO.NET下SqlBulkCopy()对照LINQ 下InsertAllOnSubmit()
- C#:30行数据插入到数据库中的效率测试-一行行执行、构造SQL一次执行、SqlBulkCopy
- C#:30行数据插入到数据库中的效率测试-一行行执行、构造SQL一次执行、SqlBulkCopy
- 查询大数据表的效率对比:Linq to SQL、Entity Framework、企业库存储过程、ADO.Net
- ADO.NET 新特性之SqlBulkCopy(批量插入大量数据)
- c#ADO.NET / 用 SqlBulkCopy 类,海量批写入数据库
- 查询大数据表的效率对比:Linq to SQL、Entity Framework、企业库存储过程、ADO.Net
- ADO.NET下的SqlBulkCopy类执行数据库间批量复制操作
- 大数据批量插入数据库使用(SqlBulkCopy )效率更高
- C#批量保存方法-利用Net SqlBulkCopy 批量导入数据库,速度超快-通用方法源码提供
- 使用SqlBulkCopy提高批量插入数据库性能
- ADO.NET 2.0 - 读者询问能否使用 SqlBulkCopy 对象来大量复制文字文件
- 利用ADO.NET SqlBulkCopy 大批量快速导入数据
- SqlBulkCopy in ADO.NET 2.0
- .net批量插入数据库,SqlBulkCopy方法
- ADO.NET 2.0 - 读者询问能否使用 SqlBulkCopy 对象来大量复制文字文件
- SqlBulkCopy实现大容量数据快速插入数据库中
- 利用SqlBulkCopy一次性把Table数据插入到数据库
- Silverlight + WCF使用Linq to SQL以及ADO.NET Entity Data Model更新数据库子表方法
- 将txt文件中的数据批量插入到数据库中SqlBulkCopy