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\BS All/N All/Y 200 500 700 1000 2000 3000 4000 5000 8000 1W 13000 15000 17000 2W 5W 10W
1W 154 320 399 800 288 494 289 176 139 177 164 148 118 160 105 119 153 160
2W 551 1370 930 689 1080 362 424 336 317 439 328 284 273 366 260 380 668 483
3W 3964 794 3218 909 687 603 500 509 528 569 514 433 428 417 415 650 768 960
4W 1522 1162 1957 1124 1068 841 818 628 623 1083 613 591 607 590 720 1036 2580 1443
5W 2840 1954 39251 1332 1192 942 1530 843 755 1526 1011 739 773 941 631 1444 2721 1546
6W 2617 2133 2644 6680 1769 1711 1150 1194 945 964 1026 917 831 907 955 1568 2494 2119
7W 2511 2838 35458 14616 2851 5039 1117 1077 1256 1066 985 1194 987 959 962 1938 2338 2523
8W 2597 3450 83907 7030 21203 2384 1344 1262 2007 1325 1236 1198 1213 1674 1357 2356 3057 2582
9W 3298 3932 / 20850 2734 5189 1702 2497 1473 1346 1326 1408 1229 1271 1324 2715 3317 3296
10W 3595 3931 / 2347 2577 5288 1741 1536 1660 1864 1396 1509 1375 1434 1525 2901 3883 4000
20W 19180 7846 172418 52276 47213 33549 5656 4522 3132 3147 3494 3095 3355 4388 3018 6237 8534 8612
30W 13897 14073 284765 112254 41917 74765 57687 6262 12380 5811 6796 5053 6709 4376 5531 9530 15795 12887
40W 17589 18879 415882 192830 124810 38071 40552 12071 18681 9907 8606 14441 50841 5959 8875 12453 16660 16821
50W 22605 22683 579140 253602 164973 202292 22106 24128 11412 36833 8495 15003 11787 10930 9061 20503 37357 79995
100W 57216 51917 / 544906 357691 244880 84304 21181 57038 63351 19827 32670 51223 40296 56484 73259 654565 53192

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

posted @ 2020-09-09 11:07  Vaynedy  阅读(327)  评论(0编辑  收藏  举报