转自:https://www.cnblogs.com/LenLi/p/3903641.html

结合博主实例,自己测试了一下,把数据改为3万行更明显!!

关于上一篇博客中提到的,在进行批量数据插入数据库的时候可以通过给存储过程传递一个类型为Table的参数进行相关操作,在这个过程中本人没有进行效率的测试。后来查找发现可以通过SqlBulkCopy类进行大数据插入操作,本文就来介绍一个这个类的作用并做了相关的效率测试(与Insert语句进行对比)。

SqlBulkCopy只能向SqlServer表写入数据,该表既可以是同一个服务器上的也可以是远程服务器上的。当然要写入的数据即数据源不单单是SqlServer,可以是任何数据源,只要数据可以加载到DataTable中或者DataReader可以读取的数据。

SqlBulkCopy类批量插入数据代码如下:

1.先创建一个User类,对应数据库的User表。

 1 public class User
2 {
3 public User()
4 {
5
6 }
7 public string UserName { get; set; }
8 public string PassWord { get; set; }
9 public string Address { get; set; }
10 public string Telephone { get; set; }
11 }

数据库User表结构:

2.创建一个返回存储了一万条数据的DataTable方法:

 1     protected DataTable GetDataTableData()
2 {
3 List<User> userList=new List<User>();
4 for (int i = 0; i < 10000; i++)
5 {
6 User user=new User();
7 user.UserName = "zhangsan";
8 user.PassWord = "123456";
9 user.Address = "北京路一号";
10 user.Telephone = "13232323232";
11 userList.Add(user);
12 }
13 using (DataTable dt = new DataTable())
14 {
15 dt.Columns.Add("UserName", typeof (string));
16 dt.Columns.Add("PassWord", typeof(string));
17 dt.Columns.Add("Address", typeof(string));
18 dt.Columns.Add("Telephone", typeof(string));
19 foreach (User user in userList)
20 {
21 DataRow dr = dt.NewRow();
22 dr["UserName"] = user.UserName;
23 dr["PassWord"] = user.PassWord;
24 dr["Address"] = user.Address;
25 dr["Telephone"] = user.Telephone;
26 dt.Rows.Add(dr);
27 }
28 return dt;
29 }
30 }

3.在页面上放了一个按钮,点击该按钮便可进行数据的插入操作,按钮点击事件代码如下:

 1     protected void Button1_Click(object sender, EventArgs e)
2 {
3 string conStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
4 SqlConnection connection=new SqlConnection(conStr);
5 try
6 {
7 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conStr, SqlBulkCopyOptions.KeepIdentity|SqlBulkCopyOptions.UseInternalTransaction))
8 {
9 bulkCopy.DestinationTableName = "dbo.[User]";//目标表,就是说您将要将数据插入到哪个表中去
10 bulkCopy.ColumnMappings.Add("UserName", "UserName");//数据源中的列名与目标表的属性的映射关系
11 bulkCopy.ColumnMappings.Add("PassWord", "PassWord");
12 bulkCopy.ColumnMappings.Add("Address", "Address");
13 bulkCopy.ColumnMappings.Add("Telephone", "Telephone");
14 DataTable dt = GetDataTableData();//数据源数据
15 //bulkCopy.BatchSize = 3;
16 Stopwatch stopwatch=new Stopwatch();//跑表,该类可以进行时间的统计
17 stopwatch.Start();//跑表开始
18 bulkCopy.WriteToServer(dt);//将数据源数据写入到目标表中
19 Response.Write("插入数据所用时间:"+stopwatch.Elapsed);//跑表结束,Elapsed是统计到的时间
20 }
21 }
22 catch (Exception ex)
23 {
24 throw new Exception(ex.Message);
25 }
26 Response.Write("<br/>插入成功!!!");
27 }

SqlServer中通过Insert语句批量插入数据的代码如下:

1.首先创建一个插入一万条数据的存储过程,插入的数据与SqlBulkCopy插入的数据一模一样。

 1 CREATE PROC USP_InsertUserTable
2 AS
3 BEGIN
4 DECLARE @i INT
5 SET @i=1
6 WHILE @i<10001
7 BEGIN
8 INSERT INTO dbo.[User]
9 ( UserName ,
10 PassWord ,
11 Address ,
12 Telephone
13 )
14 VALUES ( N'zhangsan' , -- UserName - nvarchar(50)
15 N'123456' , -- PassWord - nvarchar(6)
16 N'北京路一号' , -- Address - nvarchar(50)
17 '13232323232' -- Telephone - varchar(11)
18 )
19
20 SET @i=@i+1
21 END
22 END

2.执行存储过程。
EXEC dbo.USP_InsertUserTable

SqlBulkCopy与Insert语句效率测试对比如下:

SqlBulkCopy所用时间统计(5次):

SqlServer Insert语句所用时间统计(5次),通过工具--》Sql Server Profiler进行测试,使用的模板是TSQL_Duration:

有一点需要注意的:无论是SqlBulkCopy还是Insert语句进行操作,每次测试前都应该进行缓冲区清理以及删除原有数据,以免对测试进行影响,代码如下:

DBCC DROPCLEANBUFFERS
DBCC FREESYSTEMCACHE( 'ALL' ) 
DELETE dbo.[User]

结论:通过以上的统计分析测试,可以看出SqlBulkCopy操作大数据插入的效率性能明显比Insert语句更高效。

注:SqlBulkCopy适用于单表的批量数据(几百行,上千行)操作,DbSession适用于单表或多表的少量数据操作。

转:SqlBulkCopy类进行大数据(一万条以上)插入测试的更多相关文章

  1. SqlBulkCopy类进行大数据(一万条以上)插入测试

    好多天没写博客了,刚刚毕业一个多月! 关于上一篇博客中提到的,在进行批量数据插入数据库的时候可以通过给存储过程传递一个类型为Table的参数进行相关操作,在这个过程中本人没有进行效率的测试.后来查找发 ...

  2. SqlBulkCopy类进行大数据(10000万条以上)插入测试

    好多天没写博客了,刚刚毕业一个多月,在IT的路上真是迷茫啊! 关于上一篇博客中提到的,在进行批量数据插入数据库的时候可以通过给存储过程传递一个类型为Table的参数进行相关操作,在这个过程中本人没有进 ...

  3. [lua, mysql] 将多条记录数据组合成一条sql插入语句(for mysql)

    -- 演示将多条记录数据组合成一条sql插入语句(for mysql) function getTpl0(tname) -- 获取表各个字段 local t = { tpl_pack = {" ...

  4. C# SqlBulkCopy类批量导入数据

    特别注意  sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); 插入的时候列的顺序可 ...

  5. 用.net中的SqlBulkCopy类批量复制数据 (转载)

    在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. .NET 2.0有一个SqlBulkC ...

  6. 使用asp.net 2.0中的SqlBulkCopy类批量复制数据

    介绍:在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个Sq ...

  7. C# 使用 SqlBulkCopy 类批量复制数据到数据库

    最近公司需要优化导入的问题,由于之前使用的方式是生成 Insert 语句插入数据库,数据量小的时候还行,但是随着发展数据量渐渐大了,之前的方法性能就跟不上了,于是发现了 SqlBulkCopy 这个类 ...

  8. JAVA基础之基本类型包装类、System类、Math类、Arrays类及大数据运算

    个人理解: 为了方便运算及调用一些方法,我们需要将基本类型的数值转换为对象:不过转换的时候需要特别注意好它们的类型到底是什么,需要调用方法的类名是哪个!特别注意是Byte常量池的相关问题(==):gc ...

  9. 基本类型包装类、System类、Math类、Arrays类、大数据运算

    1 基本类型包装类 Java中想对8种基本数据类型进行复杂操作很困难. 实际程序界面上用户输入的数据都是以字符串类型进行存储的. 程序开发中,需要把字符串转换成指定的基本数据类型. 1.1基本数据类型 ...

随机推荐

  1. C++中的析构顺序和cosnt对象

    1,当程序中存在多个对象的时候,如何确定这些对象的析构顺序? 2,单个对象创建时构造函数的调用顺序(工程经验总结): 1,调用父类的构造过程: 2,调用成员变量的构造函数(调用顺序与声明顺序相同): ...

  2. Hyper-V Centos7 虚拟机固定IP

    在网上看到很多篇文章,自己也去试验过,结果实现的效果都不是很理想,并不是自己所需要的,下面是我自己研究,最后成功的经验,希望能够帮到大家.少走一些弯路. 需求 1.无论物理机的网络环境怎么变化,都需要 ...

  3. python常量 (最全常量解析)

    常量 一.常量 变量是变化的量,常量则是不变的量.python中没有使用语法强制定义常量,也就是说,python中定义常量本质上就是变量.如果非要定义常量,变量名必须全大写. AGE_OF_NICK ...

  4. Python2 中 range 和 xrange 的区别?

    两者用法相同,不同的是 range 返回的结果是一个列表,而 xrange 的结果是一个生成器,前者是直接开辟一块内存空间来保存列表,后者是边循环边使用,只有使用时才会开辟内存空间,所以当列表很长时, ...

  5. Neo4j源代码分析

    1.下载neo4j源码 https://github.com/neo4j/neo4j/ 参考文章 原文地址:https://blog.csdn.net/e15273/article/details/7 ...

  6. 剑指offer-序列化和反序列化二叉树-树-python

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树   二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存.序列化可以基于先 ...

  7. Window Operations详解

    window(windowLength, slideInterval):返回窗口长度为windowLength,每隔slideInterval滑动一次的window DStream countByWi ...

  8. vps(windows2003)安全设置参考

    一.禁止默认共享 建立一个记事本,填上以下代码.保存为 “删除默认共享.bat”并加到启动项目中 net share c$ /del net share d$ /del net share e$ /d ...

  9. 内置的os模块和sys模块

    os模块:与操作系统交互的一种接口 """ os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname& ...

  10. noip级别模板小复习

    不是很noip的知识点就不写了. dij什么的太easy就不写了. 缩点 注意\(Tarjan\)在缩边双和求强联通分量时候的区别. 一个要判断是否在栈内一个不要. 最后\(topsort\)来\(d ...