• SqlServer优化之批量插入(SqlBulkCopy、表值参数)


    之前做项目需要用到数据库的批量插入,于是就研究了一下,现在做个总结。

    创建了一个用来测试的Student表:

    1 CREATE TABLE [dbo].[Student](
    2 [ID] [int] PRIMARY KEY NOT NULL,
    3 [Num] [varchar](10) NULL,
    4 [Name] [nvarchar](64) NULL,
    5 [Age] [int] NULL
    6 )

    一、SqlBulkCopy类:使用数据库BCP协议进行数据的批量复制,每一批的数量大约800条。

     1 /// <summary>
     2 /// 批量插入SqlBulkCopy
     3 /// </summary>
     4 /// <param name="dt"></param>
     5 /// <param name="tableName">表名</param>
     6 public static void BatchInsertBySqlBulkCopy(DataTable dt, string tableName)
     7 {
     8 using (SqlBulkCopy sbc = new SqlBulkCopy(connString))
     9 {
    10 sbc.BatchSize = dt.Rows.Count;
    11 sbc.BulkCopyTimeout = 10;
    12 sbc.DestinationTableName = tableName;
    13 for (int i = 0; i < dt.Columns.Count; i++)
    14 {
    15 sbc.ColumnMappings.Add(dt.Columns[i].ColumnName, i);
    16 }
    17 //全部写入数据库
    18 sbc.WriteToServer(dt);
    19 }
    20 }

    5万条数据插入花了2秒的时间:

     


    二、表值参数:也叫表变量参数,使用用户定义的表类型来声明,简单理解就是可以把一个表当做参数传递。

    1 CREATE TYPE [dbo].[mytb_student] AS TABLE(
    2 [ID] [int] NOT NULL,
    3 [Num] [varchar](10) NULL,
    4 [Name] [nvarchar](64) NULL,
    5 [Age] [int] NULL
    6 )

    /// <summary>
    /// 批量插入使用表值参数
    /// </summary>
    /// <param name="dt"></param>
    public static void BatchInsertByTableValue(DataTable dt, string sqlText)
    {
    using (SqlConnection sqlConn = new SqlConnection(connString))
    {
    using (SqlCommand sqlCmd = new SqlCommand(sqlText, sqlConn))
    {
    //把DataTable当做参数传入
    SqlParameter sqlPar = sqlCmd.Parameters.AddWithValue("@dt", dt);
    //指定表值参数中包含的构造数据的特殊数据类型。
    sqlPar.SqlDbType = SqlDbType.Structured;
    sqlPar.TypeName = "dbo.mytb_student";//表值参数名称
    sqlConn.Open();
    sqlCmd.ExecuteNonQuery();
    }
    }
    }

    同样插入5万条数据,也是花了2秒的时间。

    总结:SqlServer数据库批量插入除了使用SqlBulkCopy和表值参数,还可以使用SqlDataAdapter的Update方法,经过本人测试,在数据量越大的情况下,使用SqlBulkCopy的性能是最好的。
    ————————————————
    版权声明:本文为CSDN博主「chwenbin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/chwenbin/article/details/79112570

  • 相关阅读:
    JVM类加载器
    Java类加载过程
    进程间8种通信方式详解
    SpringCloud教程(Finchley版本)-00:什么是SpringCloud
    pyinstaller打包web项目
    Type javax.xml.bind.JAXBContext not present
    Cannot execute request on any known server
    websocket原理
    falsk模板jinja2与Vue冲突解决方案
    关于springboot Error resolving template之类问题
  • 原文地址:https://www.cnblogs.com/cxxtreasure/p/13052595.html
Copyright © 2020-2023  润新知