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是比较理想的值