Sql Server 用 SqlBulk 匯入大批量資料 速度測試
阿新 • • 發佈:2020-09-09
用 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, N 不設定BatchSize/ Y 設定BatchSize=dt.Rows.Count。如果不設定,預設全部資料。但根據結果看,設定不設定好像還是有區別的
測試結果,單位:毫秒
每次插入前先truncate清空表
RC\BS | All/N/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 |
100W | 57216/51917 | / | 544906 | / | 244880 | 84304 | 21181 | 57038 | 63351 | 19827 | 32670 | 51223 | 40296 | 56484 | 73259 | 654565 | / |
從本次測試結果看,BatchSize設為1W是比較理想的值