关于大批量数据入库的选择

         日常中某些需求,经常会遇到一些大批量数据写入的问题,从原始那种 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); //写入

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

 

posted @ 2020-10-30 17:54  郎中令  阅读(717)  评论(0编辑  收藏  举报