zoukankan      html  css  js  c++  java
  • SqlBulkCopy做大数据插入

    在做大批量数据插入的时候,如果用Insert into ... values (...)这种方式的话效率极低,这里介绍两种性能比较好的批量插入方法。

    1. 使用SqlBulkCopy

    private static long SqlBulkCopyInsert()
    {
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();
    DataTable dataTable = GetTableSchema();
    string passportKey;
    for (int i = 0; i < count; i++)
    {
    passportKey = Guid.NewGuid().ToString();
    DataRow dataRow = dataTable.NewRow();
    dataRow[0] = passportKey;
    dataTable.Rows.Add(dataRow);
    }
    SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connectionString);
    sqlBulkCopy.DestinationTableName = "Passport";
    sqlBulkCopy.BatchSize = dataTable.Rows.Count;
    SqlConnection sqlConnection = new SqlConnection(connectionString);
    sqlConnection.Open();
    if (dataTable!=null && dataTable.Rows.Count!=0)
    {
    sqlBulkCopy.WriteToServer(dataTable);
    }
    sqlBulkCopy.Close();
    sqlConnection.Close();
    stopwatch.Stop();
    return stopwatch.ElapsedMilliseconds;
    }

     

      使用SqlBulkCopy类进行数据插入其原理是采用了SQL Server的BCP协议进行数据的批量复制。这里我们先要建好一个DataTable(最好是通过DataAdapter来灌数据得到,因为这样出来的DataTable就已经有跟数据表相同的列定义,可以免去之后Mapping Column的步骤),把要插入的数据加进这个DataTable中,然后用SqlBulkCopy的实例来插入到数据库中。经过测试,SqlBulkCopy方法比直接用Sql语句插入数据的效率高出将近25倍。

     

      另外批量导入SQL、MYSQL等数据是同样的for循环,使用拼出来的sql或者使用参数的方式传递或者使用事务等不同方式的传递效率都不同。如果不使用SqlBulkCopy的方式的话,我测试下来做快递是用一次事务来操作为最快。因为10000次的循环如果是每次提交,那么都有链接和停止数据库的操作,或者说他包含了1000次的小事务处理。如果外面就一个事务的话效率肯定会高。

  • 相关阅读:
    C++11 二叉堆
    OpenCV --- 实现两幅图像并排合并(ROI)
    OpenCV --- 修改图像的对比度、亮度 、RGB转Gray图像、修改图像的尺寸
    Opencv --- 图像像素遍历的各种方法
    Ubuntu系统的安装(虚拟机) 并配置C/C++编译器
    在Ubuntu下编译安装nginx
    【OpenCV3】threshold()函数详解
    MFC 剪切板的使用、线程介绍
    C++基础知识 基类指针、虚函数、多态性、纯虚函数、虚析构
    【OpenCV3】cvRound()、cvFloor()、cvCeil()函数详解
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/2278826.html
Copyright © 2011-2022 走看看