Sql Server 用 SqlBulk 导入大批量数据 速度测试

用 SqlBulk 进行大批量数据导入速度还是很快的
导入速度可能跟机器配置有关系,我只测试了这一台机器
机器配置:4核8G,给数据库分配了1G内存
代码:

private void test3()
{
    var db = excelImportService.BaseRepository();
    var dt = db.FindTable("select * from LR_Excel_Export where 1=2");
    Debug.WriteLine($"{DateTime.Now} 开始构造数据");
    CreateTable(10 * 10000, ref dt);
    Debug.WriteLine($"{DateTime.Now} 构造数据完成");
    db = excelImportService.BaseRepository();
    var conn = db.getDbConnection();
    SqlBulkCopy bulkCopy = new SqlBulkCopy((SqlConnection)conn);
    bulkCopy.DestinationTableName = "LR_Excel_Export";
    //bulkCopy.BatchSize = dt.Rows.Count;
    bulkCopy.BatchSize = 10000; //每个batch提交一次,默认全部数据
    bulkCopy.BulkCopyTimeout = 60 * 30; //每个batch提交超时,默认30S
    var wt = CommonHelper.TimerStart();
    conn.Open();
    try
    {
        Debug.WriteLine($"{DateTime.Now} 开始提交");
        bulkCopy.WriteToServer(dt);
        var cost = CommonHelper.TimerEnd(wt);
        Debug.WriteLine($"{DateTime.Now} 提交完成,用时:{cost}");
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
    finally
    {
        bulkCopy.Close();
        db.Close();
    }
    Debug.WriteLine("done");
}

private DataTable CreateTable(int count,ref DataTable dt)
{
    //var dt = CollectionHelper.CreateTable<ExcelExportEntity>();
    for (int i = 0; i < count; i++)
    {
        DataRow dr = dt.NewRow();
        dr["F_Id"] = Guid.NewGuid().ToString();
        dr["F_Name"] = "文件名称";
        dr["F_GridId"] = Guid.NewGuid().ToString();
        dr["F_ModuleId"] = Guid.NewGuid().ToString();
        dr["F_ModuleBtnId"] = Guid.NewGuid().ToString();
        dr["F_BtnName"] = "按钮名称";
        dr["F_EnabledMark"] = 0;
        dr["F_CreateDate"] = DateTime.Now;
        dr["F_CreateUserId"] = Guid.NewGuid().ToString();
        dr["F_CreateUserName"] = "创建人姓名";
        dr["F_ModifyDate"] = DateTime.Now;
        dr["F_ModifyUserId"] = Guid.NewGuid().ToString();
        dr["F_ModifyUserName"] = "修改人名称";
        dt.Rows.Add(dr);
    }
    return dt;
}

测试结果:
RC: RowsCount数据量,单位:万
BS: BatchSize,
All/N: 不设置BatchSize
All/Y: 设置BatchSize=dt.Rows.Count。如果不设置,默认全部数据。但根据结果看,设置不设置好像还是有区别的
测试结果,单位:毫秒
每次插入前先truncate清空表

RC\BSAll/NAll/Y2005007001000200030004000500080001W1300015000170002W5W10W
1W154320399800288494289176139177164148118160105119153160
2W55113709306891080362424336317439328284273366260380668483
3W3964794321890968760350050952856951443342417415650768960
4W152211621957112410688418186286231083613591607590720103625801443
5W284019543925113321192942153084375515261011739773941631144427211546
6W261721332644668017691711115011949459641026917831907955156824942119
7W2511283835458146162851503911171077125610669851194987959962193823382523
8W25973450839077030212032384134412622007132512361198121316741357235630572582
9W32983932/2085027345189170224971473134613261408122912711324271533173296
10W35953931/234725775288174115361660186413961509137514341525290138834000
20W191807846172418522764721333549565645223132314734943095335543883018623785348612
30W138971407328476511225441917747655768762621238058116796505367094376553195301579512887
40W17589188794158821928301248103807140552120711868199078606144415084159598875124531666016821
50W22605226835791402536021649732022922210624128114123683384951500311787109309061205033735779995
100W5721651917/5449063576912448808430421181570386335119827326705122340296564847325965456553192

从本次测试结果看,BatchSize设为1W是比较理想的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值