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#轻量级企业事务
    扩展方法
    JDK Environment Variable And Change default JDK
    AsyncTask简单获取网络图片的例子
    mysql基础
    Oracle基础操作
    java 中 colkection集合、迭代器、增强for、泛型
    centos7 解决 mysql_connect()不支持请检查mysql模块是否正确加载
    python 操作MySQL避坑1064
    面向对象学习
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/2278826.html
Copyright © 2011-2022 走看看