海量数据插入数据库效率对照測试 ---ADO.NET下SqlBulkCopy()对照LINQ 下InsertAllOnSubmit()
摘要:使用.NET相关技术向数据库中插入海量数据是经常使用操作。本文对照ADO.NET和LINQ两种技术。分别使用SqlBulkCopy()和InsertAllOnSubmit()方法进行操作。
得出结论:同样插入工作量(1w条数据)插入效率相差200倍之巨!
測试场景:
准备两个数据库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()的更多相关文章
- sqlite3树形结构遍历效率对照測试
sqlite3树形结构遍历效率对照測试 一.缘起 项目数据结构:本人从事安防行业,视频监控领域.项目中会遇到监控点位的组织机构划分.暂时划分的巡逻点位等.这些相机点位.连同组织机构,它们在逻辑关系上构 ...
- 香蕉派路由功Openwrt、Android功耗对照測试
路由这个东西是要长期通电使用的,所以功耗也是须要关注的.如今香蕉派路由已经有了openwrt和android两个 系统,这两个系统的功耗是否一样呢? 測试工具:QUIGG的德国产功耗測试仪一个.手机充 ...
- Swift,Objective-C语言性能对照測试
原文发表于踏得网 Swift包括了非常多现代语言特性尤其是从一些脚本语言如Javascript/Ruby中汲取了营养. 此外苹果公布Swift时,使用特别选用的一些样例来宣称Swift性能对于Ojbe ...
- mongodb3.0 性能測试报告 二
mongodb3.0 性能測试报告 一 mongodb3.0 性能測试报告 二 mongodb3.0 性能測试报告 三 測试环境: 服务器:X86 pcserver 共6台 cpu: 单颗8核 ...
- JMeter使用记录1 -- JDBC測试
场景:使用jmeter对web应用和mysql数据库进行压力測试 JMeter是一款很强大的測试工具.能够用来測试web,数据库.从07年用过之后一直对它情有独钟,以下记录下在一个项目中对它的简单使用 ...
- Redis源代码分析(十三)--- redis-benchmark性能測试
今天讲的这个是用来给redis数据库做性能測试的,说到性能測试,感觉这必定是高大上的操作了.redis性能測试.測的究竟是哪方面的性能,怎样測试,通过什么指标反映此次測试的性能好坏呢.以下我通过源代码 ...
- Android性能測试 一些适用于Android Studio的代码审查和性能測试工具
导言: Android应用在CPU占用,内存消耗方面的性能指标是影响产品质量的重要因素,因为QQ管家,360手机助手等应用都提供直观的内存消耗,流量监控功能,致使用户比以往更加关注软件的性能,并以此进 ...
- Java web測试分为6个部分
1.功能測试 2.性能測试(包含负载/压力測试)3.用户界面測试 4. 兼容性測试 5. 安全測试 6.接口測试 1 功能測试 1.1 链接測试 链接測试可分为三个方面. 首先,測试全部链接是 ...
- Maven实战(五)——自己主动化Web应用集成測试
自己主动化集成測试的角色 本专栏的上一篇文章讲述了Maven与持续集成的一些关系及详细实践,我们都知道,自己主动化測试是持续集成不可缺少的一部分,基本上,没有自己主动化測试的持续集成,都非常难称之为真 ...
随机推荐
- caffe工程配置问题
一开始是碰到没有caffe/caffe.hpp文件的问题,不知道怎么弄.通过百度,知道了在makefile文件里加入头文件路径和库文件路径就行. 首先是caffe.pb.h丢失问题,解决方法:http ...
- 从xml文件中绑定数据到DropDownList控件上
参考了2篇文章: http://www.cnblogs.com/JuneZhang/archive/2010/11/23/1885671.html http://blog.sina.com.cn/s/ ...
- C++ bitset类的使用与简介
有些程序要处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值.位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法.标准库提供了bitset类使得处理位集合更容易一些.要使 ...
- 节点流——FileReaderWriter
import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io ...
- HDU 4027 Can you answer these queries?(线段树区间开方)
Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K ...
- 个人环境搭建——搭建tomcat
搭建tomcat 和前几个软件一样,Tomcat 同样是由JAVA开发的,所以,在安装前一定要装好JDK,具体JDK搭建过程参见 个人环境搭建——搭建JDK环境 篇. 系统环境:ubuntu12. ...
- 自己搭建了一个blog
https://svtt.sinaapp.com 利用JustWriting开源项目搭建的,不过还是有些许问题.但是考虑到自己的blog好处多多,暂且用着--有时间或者乐趣来了,自己再用wordpre ...
- Codevs 1060 搞笑世界杯
1060 搞笑世界杯 时间限制: 1 s空间限制: 128000 KB题目等级 : 钻石 Diamond 题目描述 Description 随着世界杯小组赛的结束,法国,阿根廷等世界强队都纷纷被淘汰, ...
- css3动画、边框、投影知识
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 详解C中volatile关键字(转)
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储 ...