1. 程式人生 > 實用技巧 >Sql Server 用 SqlBulk 匯入大批量資料 速度測試

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