关于大批量数据入库的选择
日常中某些需求,经常会遇到一些大批量数据写入的问题,从原始那种 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); //写入
当然,如果时间过长,原因就是表约束太多,包括索引,外键,主键,这些根据当前业务,能不要就不要,如果非要不可,只能考虑异步操作,不然真的太耗时间,而且操作的等待时间,是存在锁表行为的,这个时间越短越好,如果避免不了,建议闲时操作
大家好,我是新来的小白,文未佳,却已创。转载请声明(博客园-郎中令)出处,谢谢
---市人皆大笑,举手揶揄之(手动链接博客园)