批量插入 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吧,原理还的高手告知~~

时间: 2024-08-05 03:45:18

批量插入 SqlBulkCopy的测试的相关文章

sqlserver数据库批量插入-SqlBulkCopy

当想在数据库中插入大量数据时,使用insert 不仅效率低,而且会导致一系列的数据库性能问题 当使用insert语句进行插入数据时.我使用了两种方式: 每次插入数据时,都只插入一条数据库,这个会导致每次插入数据时不断打开关闭数据库链接,导致效率过低(最差) 使用拼接字符串的方式来进行批量插入数据,但是使用StringBuilder 会占用极大的内存 以上方式对于批量插入数据都不是一个好的选择, 针对这种情况我使用了SqlBulkCopy sqlbulkCopy:将其它数据源批量加载sqlserv

Mybatis+mysql批量插入性能分析测试

前言 今天在网上看到一篇文章(后文中的文章指的就是它) https://www.jianshu.com/p/cce617be9f9e 发现了一种有关于mybatis批量插入的新方法,而且看了文章发现我原来的方法好像有点问题,但是由于文章中使用的环境是sqlserver而我经常使用的是mysql所以还是需要亲自来试试. 环境说明 项目使用springboot mybatis 数据库mysql5.7 使用本地mysql所以网络可以忽略不计 插入对象完全相同,只有id自增 表结构如下: CREATE

【ADO.NET-中级】百万级数据的批量插入的两种方法测试

在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题.下面介绍SQL Server支持的两种批量数据插入方法:Bulk和表值参数(Table-Valued Parameters). 运行下面的脚本,建立测试数据库和表值参数. --Create DataBase create database BulkTestDB; Go use BulkTestDB; go --Create Table Cr

ADO.NET 新特性之SqlBulkCopy(批量插入大量数据)

转自:http://blog.csdn.net/huaer1011/article/details/2312361 在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便.而在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们通过DataTable或DataReader批量迁移数据.数据源可以来自关系数据库或者XML文件,甚至WebService返回结果.其中最重要的一个类就是SqlBulkCopy类,使用它

C#中的SqlBulkCopy批量插入数据

在C#中,我们可以使用sqlBulkCopy去批量插入数据,其他批量插入方法不在讨论. 1 /// <summary> 2 /// SqlBulkCopy批量插入数据 3 /// </summary> 4 /// <param name="connectionStr">链接字符串</param> 5 /// <param name="dataTableName">表名</param> 6 ///

用SqlBulkCopy实现批量插入数据

1.建立一张测试表 test CREATE TABLE test ( F_Name NVARCHAR(20) NULL, F_Age INT NULL ) 2.SqlBulkCopy批量插入数据 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Data.SqlClient; 5 using System.Data; 6 7 namespace sqlbulkcopy 8

C# 封装SqlBulkCopy,让批量插入更方便

关于 SqlServer 批量插入的方式,前段时间也有大神给出了好几种批量插入的方式及对比测试(http://www.cnblogs.com/jiekzou/p/6145550.html),估计大家也都明白,最佳的方式就是用 SqlBulkCopy.我对 SqlBulkCopy 封装成了一个 Helper 方法,使得批量插入更加方便,先看看封装后的方法定义: public static class SqlConnectionExtension { /// <summary> /// 使用 Sq

SqlBulkCopy简单封装,让批量插入更方便

关于 SqlServer 批量插入的方式,前段时间也有大神给出了好几种批量插入的方式及对比测试(http://www.cnblogs.com/jiekzou/p/6145550.html),估计大家也都明白,最佳的方式就是用 SqlBulkCopy.自从LZ把Chloe.ORM开源以后,有不少园友/群友询问,框架怎么批量插入数据.我的回答是不支持!最后建议他们用 SqlBulkCopy 的方式插入.在我们公司,我对 SqlBulkCopy 封装成了一个 Helper 方法,使得批量插入更加方便,

SqlBulkCopy与触发器,批量插入表(存在则更新,不存在则插入)

临时表:Test /****** 对象: Table [dbo].[Test] 脚本日期: 05/10/2013 11:42:07 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Test]( [ID] [int] IDENTITY(1,1) NOT NULL, [UserID] [int] NOT NULL, [UserName] [nvarchar](50) COLLATE Chines