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

好多天没写博客了,刚刚毕业一个多月,在IT的路上真是迷茫啊!

关于上一篇博客中提到的,在进行批量数据插入数据库的时候可以通过给存储过程传递一个类型为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 @[email protected]+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类进行大数据(10000万条以上)插入测试,布布扣,bubuko.com

时间: 2024-10-05 05:07:47

SqlBulkCopy类进行大数据(10000万条以上)插入测试的相关文章

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

-- 演示将多条记录数据组合成一条sql插入语句(for mysql) function getTpl0(tname) -- 获取表各个字段 local t = { tpl_pack = {"packId","itemId","`group`","num","rate","rateType"}, } for k, v in pairs(t) do if tname == k then r

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

介绍:在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个SqlBulkCopy类,它可以帮助你从不同的数据源复制数据到SQL SERVER数据库. 本文中我将示范SqlBulkCopy类的不同应用. 数据库设计: 这个数据库的设计还是蛮简单的,它基于Northwind数据库的Products表.另外我还在Northwind数据库中创建了3个表. 详情可以看一

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

最近公司需要优化导入的问题,由于之前使用的方式是生成 Insert 语句插入数据库,数据量小的时候还行,但是随着发展数据量渐渐大了,之前的方法性能就跟不上了,于是发现了 SqlBulkCopy 这个类. 使用 SqlBulkCopy 类只能向 SQL Server 表写入数据.但是,数据源不限于 SQL Server:可以使用任何数据源,只要数据可加载到 DataTable 实例或可使用 IDataReader 实例读取数据. public class Conn { private static

Date、DateFormat类、Calendar类、基本类型包装类、System类、Math类、Arrays类、大数据运算类

1.Date (1)概述: 时间的原点:公元1970年 一月一日,午夜0:00:00 对应的毫秒值就是0 注意:时间和日期的计算,必须依赖毫秒值 ----------------Date()获取当前时间 import java.util.Date; public class Demo06boke { public static void main(String[] args) { Date sdf=new Date(); System.out.println(sdf); } } Date(lon

sql server中的大数据的批量操作(批量插入,批量删除)

首先我们建立一个测试用员工表 ---创建一个测试的员工表--- create table Employee( EmployeeNo int primary key, --员工编号 EmployeeName nvarchar(50) null, --员工名称 CreateUser nvarchar(50) null, --创建人 CreateDate datetime null, --创建时间 ) 执行后结果: 那么假如我们要批量插入10000条数据,应该怎么办? 这里有四种方法(普通循环,事务循

Java基础知识回顾-18(Math类,Arrays类和大数据运算)

public class MathDemo { public static void main(String[] args) { double x=12.2; //取绝对值 System.out.println(Math.abs(-99)); //向上取整 System.out.println(Math.ceil(x)); //向下取整 System.out.println(Math.floor(x)); //取最大值 System.out.println(Math.max(2,5)); //取

批量插入100万条数据

创建数据库: --Create DataBase create database BulkTestDB; go use BulkTestDB; go --Create Table Create table BulkTestTable( Id int primary key, UserName nvarchar(32), Pwd varchar(16)) go --Create Table Valued CREATE TYPE BulkUdt AS TABLE (Id int, UserName

在asp.net 2.0中使用SqlBulkCopy类迁移数据

在asp.net 2.0中使用SqlBulkCopy类迁移数据 (转) http://jackyrong.cnblogs.com/archive/2005/08/29/225521.html 我们经常要在一个表中将数据迁移到另一个表,当然,用的方法十分多了.在.net 2.0中,提供了一个sqlbulkcopy类,也可以实现如下的操作,下面简单介绍下.比如一个表如下CREATE TABLE Person3( PersonID int IDENTITY(1,1) PRIMARY KEY, Name

你的信息只值1毛钱 大数据时代如何不做“透明人”?

随着移动互联网的快速发展,各类手机APP也深入到我们生活的方方面面,例如外卖订餐.打车出行等等.但我们在享受这些便捷的同时,个人信息也愈加公开化和透明化. 据悉,许多不法分子盯上了外卖平台这块"肥肉"--用户信息齐全.获取方式容易.一些网络运营公司还会借助软件搜集用户订餐信息,再打包倒卖给电话销售公司,通过贩卖客户信息进行非法牟利.甚至,这些用户信息还会落入诈骗团伙手中,后果不堪设想. 外卖信息泄露成灾 一毛钱就能拿到你的个人信息! 近日,多家外卖平台用户个人信息遭泄露的事件频频发生.