• 海量数据插入数据库效率对照測试 ---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

  • 相关阅读:
    中共中央办公厅的机构设置(局、室)
    清理winsxs文件夹(系统更新文件)的第三方工具
    通用的MIME类型:application/octet-stream
    “IIS7.5无法写入配置文件web.config”的解决方案
    刷新组策略的命令
    windows网络和共享中心“查看基本网络信息并设置连接”为“未知”的解决方案
    使 windows 无需输入开机密码自动进入系统
    windows server 2008 R2 的 FTP 防火墙的正确配置方法
    搜狗浏览器不能使用拖拽搜索的解决方案
    无法启动 Diagnostic Policy Service(服务错误 1079)的解决方案
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6792088.html
Copyright © 2020-2023  润新知