zoukankan      html  css  js  c++  java
  • 海量数据插入数据库效率对照測试 ---ADO.NET下SqlBulkCopy()对照LINQ 下InsertAllOnSubmit()

    摘要:使用.NET相关技术向数据库中插入海量数据是经常使用操作。本文对照ADO.NET和LINQ两种技术。分别使用SqlBulkCopy()和InsertAllOnSubmit()方法进行操作。

    得出结论:同样插入工作量(1w条数据)插入效率相差200倍之巨!

     

    測试场景:

    准备两个数据库TestDb和TestDb2。有表:T_Users。表结构例如以下图所看到的:


    SqlBulkCopy()插入方法例如以下:

    private static Stopwatch InsertUsingSqlBulkCopy(List<UserInMemory> list)
            {
                Stopwatch stopWatch = new Stopwatch();
                stopWatch.Start();
                DataTable dt = new DataTable();
                dt.Columns.Add("ID");
                dt.Columns.Add("UserName");
                for (int i = 0; i < list.Count; i++)
                {
                    DataRow row = dt.NewRow();
                    row["ID"] = list[i].ID;
                    row["UserName"] = list[i].UserName;
                    dt.Rows.Add(row);
                }
                using (SqlConnection con = new SqlConnection(connStr2))
                {
                    con.Open();
                    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con))
                    {
                        try
                        {
                            bulkCopy.DestinationTableName = "dbo.T_UserName";
                            bulkCopy.ColumnMappings.Add("ID", "ID");
                            bulkCopy.ColumnMappings.Add("UserName", "UserName");
                            bulkCopy.WriteToServer(dt);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.ToString());
                        }
                        finally { con.Close(); }
                    }
                }
                stopWatch.Stop();
                return stopWatch;
            }
    

    LINQ插入方法例如以下所看到的:

    private static Stopwatch InsertUsingLINQ(List<T_User> _list)
            {
                Stopwatch stopWatch = new Stopwatch();
                stopWatch.Start();
                DataClasses1DataContext dataContext = new DataClasses1DataContext();
                dataContext.T_Users.InsertAllOnSubmit(_list);
                dataContext.SubmitChanges();
                stopWatch.Stop();
                return stopWatch;
            }
    

    使用上述代码分别导入1万条User数据进入数据库。

    得到结果例如以下图所看到的:


    同样插入工作量(1w条数据)前提下,结论:

    1 ADO.NET下SqlBulkCopy()方法是LINQ TO SQL下InsertAllOnSubmit()方法插入效率相差266倍之巨!

    2  LINQ使用便捷、代码简短、学习成本低。语言表达优雅;可是,假设对效率要求较高的海量数据相关操作优先推荐使用ADO.NET方法。



    注意事项:

    假设在导入数据过程中提示“超时相关操作”,请在WriteToServer()方法前增加例如以下代码:

                            bulkCopy.BulkCopyTimeout = 3600;
                            bulkCopy.BatchSize = 3000;
                            bulkCopy.WriteToServer(dt);
    BatchSize为每次传输数量的设置。

    BulkCopyTimeout为超时上限秒数。

    相关源代码下载地址:http://download.csdn.net/detail/fanrong1985/8130953

  • 相关阅读:
    php中php5_module、fastcgi和php-fpm是什么东西??
    Java中接口(interface)和抽象类(abstract)的区别
    Http中的status code
    排查服务器遇到的错误-查看tomcat日志命令
    Java中对list集合进行判空
    Java中的序列化、反序列化-serializable和serialversionUID
    wave文件头之笔记
    乱七八糟的流
    CentOS新建虚拟机后配置静态IP
    rabbitMQ
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6792088.html
Copyright © 2011-2022 走看看