首页 > 数据库 >SqlBulkCopy(批量复制)方法,高性能批量插入数据

SqlBulkCopy(批量复制)方法,高性能批量插入数据

时间:2022-11-13 22:12:05浏览次数:39  
标签:批量 Age SqlBulkCopy 高性能 var new CreateTime con

https://blog.51cto.com/u_15162069/2751372

https://blog.csdn.net/five_s/article/details/115213102

SQL Server 批量插入数据方案 SqlBulkCopy 相较于 Insert 语句而言有20~40倍性能提升,下面我们将 SqlBulkCopy 进行简单封装,让批量插入更方便

一、Sql Server插入方案介绍
关于 SqlServer 批量插入的方式,有三种比较常用的插入方式,Insert、BatchInsert、SqlBulkCopy,下面我们对比以下三种方案的速度.

1.普通的Insert插入方法

public static void Insert(IEnumerablepersons)
{
    using (var con = new SqlConnection("Server=.;Database=DemoDataBase;User ID=sa;Password=8888;"))
    {
        con.Open();
        foreach (var person in persons)
        {
            using (var com = new SqlCommand(
                "INSERT INTO dbo.Person(Id,Name,Age,CreateTime,Sex)VALUES(@Id,@Name,@Age,@CreateTime,@Sex)",
                con))
            {
                com.Parameters.AddRange(new[]
                {
                    new SqlParameter("@Id", SqlDbType.BigInt) {Value = person.Id},
                    new SqlParameter("@Name", SqlDbType.VarChar, 64) {Value = person.Name},
                    new SqlParameter("@Age", SqlDbType.Int) {Value = person.Age},
                    new SqlParameter("@CreateTime", SqlDbType.DateTime)
                        {Value = person.CreateTime ?? (object) DBNull.Value},
                    new SqlParameter("@Sex", SqlDbType.Int) {Value = (int)person.Sex},
                });
                com.ExecuteNonQuery();
            }
        }
    }
}

2.拼接BatchInsert插入语句
public static void BatchInsert(Person[] persons)
{
    using (var con = new SqlConnection("Server=.;Database=DemoDataBase;User ID=sa;Password=8888;"))
    {
        con.Open();
        var pageCount = (persons.Length - 1) / 1000 + 1;
        for (int i = 0; i < pageCount; i++)
        {
            var personList = persons.Skip(i * 1000).Take(1000).ToArray();
            var values = personList.Select(p =>
                $"({p.Id},'{p.Name}',{p.Age},{(p.CreateTime.HasValue ? $"'{p.CreateTime:yyyy-MM-dd HH:mm:ss}'" : "NULL")},{(int) p.Sex})");
            var insertSql =
                $"INSERT INTO dbo.Person(Id,Name,Age,CreateTime,Sex)VALUES{string.Join(",", values)}";
            using (var com = new SqlCommand(insertSql, con))
            {
                com.ExecuteNonQuery();
            }
        }
    }
}

3.SqlBulkCopy插入方案
登录后复制
public static void BulkCopy(IEnumerablepersons)
{
    using (var con = new SqlConnection("Server=.;Database=DemoDataBase;User ID=sa;Password=8888;"))
    {
        con.Open();
        var table = new DataTable();
        table.Columns.AddRange(new []
        {
            new DataColumn("Id", typeof(long)), 
            new DataColumn("Name", typeof(string)), 
            new DataColumn("Age", typeof(int)), 
            new DataColumn("CreateTime", typeof(DateTime)), 
            new DataColumn("Sex", typeof(int)), 
        });
        foreach (var p in persons)
        {
            table.Rows.Add(new object[] {p.Id, p.Name, p.Age, p.CreateTime, (int) p.Sex});
        }

        using (var copy = new SqlBulkCopy(con))
        {
            copy.DestinationTableName = "Person";
            copy.WriteToServer(table);
        }
    }
}

3.三种方案速度对比

 

 

两者插入效率对比,Insert明显比SqlBulkCopy要慢太多,大概20~40倍性能差距,下面我们将SqlBulkCopy封装一下,让批量插入更加方便

 

 

 

 

 

 

 

这样就批量插入完毕了,执行起来速度很快。
sqlBulkCopy.DestinationTableName------->指定数据库表名
sqlBulkCopy.BatchSize--------->每一批次的行数
sqlBulkCopy.ColumnMappings.Add------->指定数据库与数据源之间的对应关系
————————————————
版权声明:本文为CSDN博主「灯火明亮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/five_s/article/details/115213102

 

标签:批量,Age,SqlBulkCopy,高性能,var,new,CreateTime,con
From: https://www.cnblogs.com/Dongmy/p/16887141.html

相关文章

  • chrome浏览器 开发者工具F12中某网站的sources下的源码如何批量保存
    1.常用保存Sources源码的两种方法1.1单个文件直接右键另存为1.2单个页面保存网页,就会把引用到的所有文件下载下来如果页面很多,文件也很多,静态资源也很多,那么得一......
  • 28、批量实现txt文件内容合并
    题目:  在many_org文件夹中有三个.txt文件,如何将三个文件的内容整理到一个文件里?思路:  1、遍历路径下的所有文件。  2、判断出.txt文件,将其所有内容保存至新列表......
  • 文件批量重命名
    批量重命名一、背景我从网上下载了一部电视剧《琅琊榜》,存放在了E:/琅琊榜目录下:但有没有发现片名好长好长,这严重影响了我的观看体验,我该怎样才能将片名中的「未删减......
  • 发现一款音频批量下载小工具,喜欢的喜马拉雅音频都能直接下到自己的硬盘里
    最近发现了一款音频下载工具,解决了我多年的困惑。因为喜欢喜马拉雅的好多连载小说,所以购买了VIP,手机里实在装不下了,但又没法存储在硬盘里。最近用了一款音频下载小工具,找......
  • 喜“赢”双十一,SOLIDWORKS批量编码器工具免费送!
    为了答谢广大新老朋友的关注与支持,值此双十一来临之际,SolidKits免费发放100套专业版SOLIDWORKS批量编码器工具,活动期间下载并安装SolidKits.BatchCoding批量编码器工具,即......
  • python代码批量压缩图片
    python代码批量压缩图片以下代码用于批量压缩png/jpg格式的图片文件,遇到报错就使用pip大法安装一下对应的类库就可以了dynamic_quality.pyimportPIL.Imagefrommathi......
  • 开源一段 Mac 批量压缩图片的脚本
    近日处理了一批照片,现在分享一下如何在mac平台进行图片批量处理。0、安装xCode命令行工具,需要确定电脑上已经安装了xCode,如果没有,自己去AppStore里面搜索就看到了。......
  • 快速批量删除 Salesforce ApexLogs 或者其他对象
    实际开发中,有时候ApexLog会超出限制,系统就会提示,由于Salesforce不支持下面这种方式delete[SELECTIdFROMApexLog];这时如果想删除这些数据,有两种界面化方式:在......
  • 每周一脚本:批量对多个文件增加前缀
    最近从设计师那里get了超多的图,结果都是1.png,2.png这样的文件名,自己还需要将这些文件变成可读的文件名,不想一个一个得修改,于是就写了一个简单的脚本,实现批量对多个文件增加......
  • 变量初始化与数据批量操作
    在tensorflow中通过tf.Variable()添加变量,变量就是在tensorflow程序运行中不断改变的量,也就是“学习”的过程,通过改变变量来降低loss  所有变量在进行图操作前,一定要进......