批量插入 SqlBulkCopy的测试
关于SqlBulkCopy的测试
最近要做.net关于sql大量插入,找到了sqlbulkcopy(自己google下,应该很多说明了)这个好东西,于是测试下性能,用了三个方法对比:
1)直接用ado.net,for循环N次进行单条插入
2)把N条插入语句拼在一个sql,进行插入
3)直接使用sqlbulkcopy进行插入
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; using System.Diagnostics; namespace SQLTEST { class Program { static void Main( string [] args) { //int time = 200; test(20); test(200); test(2000); test(10000); test(50000); Console.ReadLine(); } public static void test( int time){ Stopwatch sp = new Stopwatch(); Console.WriteLine(time + "条数据插入测试" ); //测试方法1 { using (SqlConnection sqlcon = new SqlConnection( "Data Source=.;Initial Catalog=Test;User ID=sa;Password=??" )) { sqlcon.Open(); string singesql = "INSERT INTO [student] ([name],[age])VALUES('abc',3);" ; SqlCommand sqlcommand = new SqlCommand(singesql, sqlcon); //计时开始 sp.Restart(); for ( int i = 0; i < time; i++) { sqlcommand.ExecuteNonQuery(); } sp.Stop(); } } Console.WriteLine( "方法1:" + sp.ElapsedMilliseconds + "毫秒" ); //测试方法2 { using (SqlConnection sqlcon = new SqlConnection( "Data Source=.;Initial Catalog=Test;User ID=sa;Password=??" )) { sqlcon.Open(); string singesql = "INSERT INTO [student] ([name],[age])VALUES('abc',3);" ; string execsql = "" ; for ( int i = 0; i < time; i++) { execsql = execsql + singesql; } SqlCommand sqlcommand = new SqlCommand(execsql, sqlcon); //计时开始 sp.Restart(); sqlcommand.ExecuteNonQuery(); sp.Stop(); } } Console.WriteLine( "方法2:" + sp.ElapsedMilliseconds + "毫秒" ); //测试方法3 { using (SqlConnection sqlcon = new SqlConnection( "Data Source=.;Initial Catalog=Test;User ID=sa;Password=??" )) { sqlcon.Open(); SqlBulkCopy sqlc = new SqlBulkCopy(sqlcon); DataTable dt = new DataTable(); dt.Columns.Add( "id" ); dt.Columns.Add( "name" ); dt.Columns.Add( "age" ); for ( int i = 0; i < time; i++) { dt.Rows.Add(38009, "nemw" , 123); } sqlc.DestinationTableName = "student" ; //计时开始 sp.Restart(); sqlc.WriteToServer(dt); sp.Stop(); } } Console.WriteLine( "方法3:" + sp.ElapsedMilliseconds + "毫秒" ); Console.WriteLine(); } } } |
插入N条数据的测试结果如下:
效率相差还是很夸张的,大家大量数据插入还是有sqlbulkcopy吧,原理还的高手告知~~
批量插入 SqlBulkCopy的测试的更多相关文章
- sqlserver数据库批量插入-SqlBulkCopy
当想在数据库中插入大量数据时,使用insert 不仅效率低,而且会导致一系列的数据库性能问题 当使用insert语句进行插入数据时.我使用了两种方式: 每次插入数据时,都只插入一条数据库,这个会导致每 ...
- Mybatis+mysql批量插入性能分析测试
前言 今天在网上看到一篇文章(后文中的文章指的就是它) https://www.jianshu.com/p/cce617be9f9e 发现了一种有关于mybatis批量插入的新方法,而且看了文章发现我 ...
- 使用SqlBulkCopy批量插入数据,测试20万条用时5秒
using System;using System.Collections.Generic;using System.Linq;using System.Text; using System.Data ...
- oracle批量插入数据(测试)
做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条 SQL快速生成大量的测试数据的方法.产生测试数据的SQ ...
- SqlServer批量插入(SqlBulkCopy、表值参数)
之前做项目需要用到数据库的批量插入,于是就研究了一下,现在做个总结. 创建了一个用来测试的Student表: CREATE TABLE [dbo].[Student]( [ID] [int] PRIM ...
- c#数据批量插入
由于之前面试中经常被问到有关EF的数据批量插入问题,今天以Sqlserver数据库为例,对.net中处理数据批量处理的方案进行了测试对比. 1.四种测试方案 (1)普通的EF数据批量插入:即调用DbS ...
- Mybatis中实现oracle的批量插入、更新
oracle 实现在Mybatis中批量插入,下面测试可以使用,在批量插入中不能使用insert 标签,只能使用select标签进行批量插入,否则会提示错误 ### Cause: java.sql.S ...
- mysql基础---->mybatis的批量插入(一)
这里面记录一下使用mybatis处理mysql的批量插入的问题,测试有可能不准.只愿世间风景千般万般熙攘过后,字里行间,人我两忘,相对无言. mybatis的批量插入 我们的测试主体类是springb ...
- [小干货]SqlBulkCopy简单封装,让批量插入更方便
关于 SqlServer 批量插入的方式,前段时间也有大神给出了好几种批量插入的方式及对比测试(http://www.cnblogs.com/jiekzou/p/6145550.html),估计大家也 ...
随机推荐
- 人脸Pose检测:ASM、AAM、CLM总结
人脸的Pose检测可以使用基于位置约束的特征点的方法.人脸特征点定位的目的是在人脸检测的基础上,进一步确定脸部特征点(眼睛.眉毛.鼻子.嘴巴.脸部外轮廓)的位置.定位算法的基本思路是:人脸的纹理特征和 ...
- 【JSP】上传图片到数据库中
第一步:建立数据库 create table test_img(id number(4),name varchar(20),img long raw); 第二步:(NewImg.html) <h ...
- 如何安全使用dispatch_sync
概述 iOS开发者在与线程打交道的方式中,使用最多的应该就是GCD框架了,没有之一.GCD将繁琐的线程抽象为了一个个队列,让开发者极易理解和使用.但其实队列的底层,依然是利用线程实现的,同样会有死锁的 ...
- Generics of a Higher Kind
http://adriaanm.github.io/files/higher.pdf https://www.atlassian.com/blog/archives/scala-types-of-a- ...
- python 生成测试报告并发送邮件
前言: 使用unittest编写自动化测试脚本,执行脚本后可以很方便看到测试用例的执行情况. 但如果想向领导汇报工作,就需要提供更直观的测试报告. 思路: 使用unittest编写测试用例,HTMLT ...
- python排序sorted与sort比较 (转)
Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. sorted(iterable,key=None,revers ...
- 混合元素app的H5元素定位
问题思考 在混合开发的App中,经常会有内嵌的H5页面.那么这些H5页面元素该如何进行定位操作呢? 解决思路 针对这种场景直接使用前面所讲的方法来进行定位是行不通的,因为前面的都是基于Andriod原 ...
- eas之获取各模块系统状态信息
public void getSystemStatue() throws EASBizException, BOSException { CompanyOrgUnitInfo co ...
- eas之style接口
Obj可以是KDTable对象,也可以是IRow,IColumn,ICell对象锁定Obj.getStyleAttributes().setLocked(true);Obj.getStyleAttri ...
- LA 3363
Run Length Encoding(RLE) is a simple form of compression. RLE consists of the process for searching ...