zoukankan      html  css  js  c++  java
  • 关于百万级大批量数据入库的选择

             日常中某些需求,经常会遇到一些大批量数据写入的问题,从原始那种 foreach 循环单笔写入数据早已过时,不能满足入库的实效性,直接忽视,.一般情况下的 orm映射是支持批量写入数据的,效率也是忽高忽低,受各种因素影响

    1. Dapper 中的 批量导入

    众所周知,Dapper 是一个构造简单的orm 映射,支持批量增删改,对于千以内的数据量,用这个没什么问题,基本都能直接应付掉,不怎么耗时,数据量一旦多起来,万以上的就不怎么管用,很耗时

    2. 多线程操作

    多线程操作,一定要理清业务,不然操作不当,也会很耗时,大批量写入数据时,要不要考虑数据完整性,还有锁表时其他线程的写入操作是无法进行下去的,不然多线程也会白搭,调度好线程,存在耗时锁表时需要 continuewith 顺序操作线程

    3. SqlBulkCopy批量操作

    这个最快,适合大批量数据写入的操作,表约束越少(主键也算),写入速度越快,无主键无外键的情况下,一百万数据只要8s,操作如下

                            //设置表名
    SqlBulkCopy bulkCopy_Sch = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.CheckConstraints, tran) { DestinationTableName = "TableName", //设置表名 BulkCopyTimeout = 60 //单笔超时时间
    BatchSize = 1000 //设置单笔操作数量 };
    //映射列
    foreach (DataColumn dc in DtScheduleDetail.Columns) //传入上述table { bulkCopy_Sch.ColumnMappings.Add(dc.ColumnName, dc.ColumnName); } bulkCopy_Sch.WriteToServer(DtScheduleDetail); //写入

    当然,如果时间过长,原因就是表约束太多,包括索引,外键,主键,这些根据当前业务,能不要就不要,如果非要不可,只能考虑异步操作,不然真的太耗时间,而且操作的等待时间,是存在锁表行为的,这个时间越短越好,如果避免不了,建议闲时操作 

  • 相关阅读:
    Codeforces Round #620 (Div. 2)
    Codeforces Round #575 (Div. 3)
    Codeforces Round #619 (Div. 2)
    2014 Nordic Collegiate Programming Contest
    Educational Codeforces Round 82 (Rated for Div. 2)
    模板
    2015-2016 ACM-ICPC Southwestern Europe Regional Contest (SWERC 15)
    模板
    Codeforces Round #618 (Div. 2)
    Codeforces Round #343 (Div. 2)
  • 原文地址:https://www.cnblogs.com/Sientuo/p/13903352.html
Copyright © 2011-2022 走看看