c# sqlsugar,hisql,freesql orm框架全方位性能測試對比 sqlserver 性能測試

来源:https://www.cnblogs.com/tansar/archive/2022/06/22/16402118.html
-Advertisement-
Play Games

在進行項目開發的時候,剛好需要用到對字元串表達式進行求值的處理場景,因此尋找了幾個符合要求的第三方組件LambdaParser、DynamicExpresso、Z.Expressions,它們各自功能有所不同,不過基本上都能滿足要求。它們都可以根據相關的參數進行字元串表達式的求值,本篇隨筆介紹它們三... ...


在2022年1月份本人做過一次sqlsugar,hisql,freesql三個框架的性能測試,上次主要是測的sqlserver下的常規插入(非bulkcopy的方式數據插入),hisql與目前比較流行的ORM框架性能測試對比 時間已經過半年,這次我就測的更完整點測試方案如下

測試方案

  1. 測試四種資料庫(sqlserver,mysql,oralce,postgresql) 每種資料庫寫一遍測試文章
  2. 常規插入和批量插入
  3. 數據量從5條到100W間的數據插入
  4. 數據列從5列和50列的各種數據類型場景
  5. 開源測試代碼供各位網友查看審核是否測試公平公正

測試源碼https://github.com/tansar/HiSqlTestDemo

測試環境

操作系統環境

sqlserver 環境

mysql 環境

oracle 環境

postgresql 環境

sqlserver 常規數據插入測試

10列以下欄位測試代碼如下

  public static void TestSqlServerInsert(int _count)
        {

      //hisql連接 請先配置好資料庫連接
      HiSqlClient sqlClient = Demo_Init.GetSqlClient();
      //hisql需要初始貨安裝 只需要執行一次
      sqlClient.CodeFirst.InstallHisql();


      //freesql連接
      IFreeSql freeClient = Demo_Init.GetFreeSqlClient();

      //sqlsugar連接
      SqlSugarClient sugarClient = Demo_Init.GetSugarClient();

      

      sqlClient.CodeFirst.CreateTable(typeof(Table.HTest01));

      Console.WriteLine("初始化hisql專用表成功!");

      sqlClient.CodeFirst.CreateTable(typeof(Table.HTest02));


      Console.WriteLine("初始化sqlsugar專用表成功!");


      sqlClient.CodeFirst.CreateTable(typeof(Table.HTest03));
      Console.WriteLine("初始化freesql專用表成功!");


      Console.WriteLine($"測試場景 Sqlserver  向表中插入{_count}條數據 常規數據插入)");
      Console.WriteLine($"用常規數據插入最適應日常應用場景");




      List<object> lstobj = new List<object>();
      List<Table.HTest02> lstobj2 = new List<Table.HTest02>();
      List<Table.HTest03> lstobj3 = new List<Table.HTest03>();
      Random random = new Random();

      //插入的參數值都隨機產生 以免資料庫執行相同SQL時會有緩存影響測試結果
      for (int i = 0; i < _count; i++)
      {
          //hisql可以用實體類也可以用匿名類
          lstobj.Add(new Table.HTest01 { SID = (i + 1), UName = $"hisql{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"hisql初始創建" });

          //sqlsugar用匿句類報錯用實體類
          lstobj2.Add(new Table.HTest02 { SID = (i + 1), UName = $"sqlsugar{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"sqlsugar初始創建" });
          lstobj3.Add(new Table.HTest03 { SID = (i + 1), UName = $"freesql{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"freesql初始創建" });
      }

      //刪除測試表中的數據
      sqlClient.TrunCate("HTest01").ExecCommand();
      sqlClient.TrunCate("HTest02").ExecCommand();
      sqlClient.TrunCate("HTest03").ExecCommand();

      Stopwatch sw = new Stopwatch();



      #region freesql
      sw.Reset();
      Console.WriteLine("------------------------------");
      Console.WriteLine("----------FreeSql 測試----------");
      Console.WriteLine($"FreeSql 預熱...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
      var temp3 = freeClient.Queryable<Table.HTest03>().Where(w => w.Age < 0).ToList();
      Console.WriteLine($"FreeSql  正在插入數據\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
      sw.Start();
      freeClient.Insert<Table.HTest03>(lstobj3).ExecuteAffrows();
      
      sw.Stop();
      Console.WriteLine($"FreeSql 數據插入{_count}條 耗時{sw.Elapsed}秒");
      sw.Reset();
      #endregion


      #region hisql
      sw.Reset();
      Console.WriteLine("------------------------------");
      Console.WriteLine("----------HiSql 測試----------");
      Console.WriteLine($"HiSql 預熱...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
      var temp1 = sqlClient.Query("HTest01").Field("*").Take(1).Skip(1).ToDynamic();
      Console.WriteLine($"HiSql  正在插入數據\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
      sw.Start();
      sqlClient.Insert("HTest01", lstobj).ExecCommand();
      sw.Stop();
      Console.WriteLine($"hisql 數據插入{_count}條 耗時{sw.Elapsed}秒");
      sw.Reset();
      #endregion

50列欄位測試代碼如下

  public static void TestSqlServer50ColInsert(int _count)
        {

            //hisql連接 請先配置好資料庫連接
          HiSqlClient sqlClient = Demo_Init.GetSqlClient();
          //hisql需要初始貨安裝 只需要執行一次
          sqlClient.CodeFirst.InstallHisql();


          //freesql連接
          IFreeSql freeClient = Demo_Init.GetFreeSqlClient();

          //sqlsugar連接
          SqlSugarClient sugarClient = Demo_Init.GetSugarClient();



          sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C01));

          Console.WriteLine("初始化hisql專用表成功!");

          sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C02));


          Console.WriteLine("初始化sqlsugar專用表成功!");


          sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C03));
          Console.WriteLine("初始化freesql專用表成功!");


          Console.WriteLine($"測試場景 Sqlserver  向表中插入{_count}條數據 50列 常規數據插入)");
          Console.WriteLine($"用常規數據插入最適應日常應用場景");




          List<object> lstobj = new List<object>();
          List<Table.H_Test50C02> lstobj2 = new List<Table.H_Test50C02>();
          List<Table.H_Test50C03> lstobj3 = new List<Table.H_Test50C03>();
          Random random = new Random();

          //插入的參數值都隨機產生 以免資料庫執行相同SQL時會有緩存影響測試結果
          for (int i = 0; i < _count; i++)
          {
              //hisql可以用實體類也可以用匿名類
              lstobj.Add(new Table.H_Test50C01 { 
                  Material=(900000+i).ToString(),
                  Batch=(30000000+i).ToString(),
                  TestNum1= random.Next(10,100),
                  TestNum2 = random.Next(10, 100),
                  TestNum3 = random.Next(10, 100),
                  TestNum4 = random.Next(10, 100),
                  TestNum5 = random.Next(10, 100),
                  TestNum6 = random.Next(10, 100),
                  TestNum7 = random.Next(10, 100),
                  TestNum8 = random.Next(10, 100),
                  TestNum9 = random.Next(10, 100),
                  TestNum10 = random.Next(10, 100),
                  TestNum11 = random.Next(10, 100),
                  TestNum12 = random.Next(10, 100),
                  TestNum13= random.Next(10, 100),
                  TestNum14= random.Next(10, 100),
                  TestNum15= random.Next(10, 100),
                  TestStr1 = $"hisql{random.Next(1, 100).ToString()}",
                  TestStr2 = $"hisql{random.Next(1, 100).ToString()}",
                  TestStr3 = $"hisql{random.Next(1, 100).ToString()}",
                  TestStr4 = $"hisql{random.Next(1, 100).ToString()}",
                  TestStr5 = $"hisql{random.Next(1, 100).ToString()}",
                  TestStr6 = $"hisql{random.Next(1, 100).ToString()}",
                  TestStr7 = $"hisql{random.Next(1, 100).ToString()}",
                  TestStr8 = $"hisql{random.Next(1, 100).ToString()}",
                  TestStr9 = $"hisql{random.Next(1, 100).ToString()}",
                  TestStr10 = $"hisql{random.Next(1, 100).ToString()}",
                  TestStr11 = $"hisql{random.Next(1, 100).ToString()}",
                  TestStr12 = $"hisql{random.Next(1, 100).ToString()}",
                  TestStr13 = $"hisql{random.Next(1, 100).ToString()}",
                  TestStr14 = $"hisql{random.Next(1, 100).ToString()}",
                  TestStr15 = $"hisql{random.Next(1, 100).ToString()}",
                  TestDec1 = i+ random.Next(1, 10000)/3,
                  TestDec2 = i + random.Next(1, 10000) / 3,
                  TestDec3 = i + random.Next(1, 10000) / 3,
                  TestDec4 = i + random.Next(1, 10000) / 3,
                  TestDec5 = i + random.Next(1, 10000) / 3,
                  TestDec6 = i + random.Next(1, 10000) / 3,
                  TestDec7 = i + random.Next(1, 10000) / 3,
                  TestDec8 = i + random.Next(1, 10000) / 3,
                  TestDec9 = i + random.Next(1, 10000) / 3,
                  TestDec10 = i + random.Next(1, 10000) / 3,
                  TestDec11 = i + random.Next(1, 10000) / 3,
                  TestDec12 = i + random.Next(1, 10000) / 3,
                  TestDec13 = i + random.Next(1, 10000) / 3,
                  TestDec14 = i + random.Next(1, 10000) / 3,
                  TestDec15 = i + random.Next(1, 10000) / 3,
                  Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"hisql初始創建" });

              //sqlsugar用匿句類報錯用實體類
              lstobj2.Add(new Table.H_Test50C02
              {
                  Material = (900000 + i).ToString(),
                  Batch = (30000000 + i).ToString(),
                  TestNum1 = random.Next(10, 100),
                  TestNum2 = random.Next(10, 100),
                  TestNum3 = random.Next(10, 100),
                  TestNum4 = random.Next(10, 100),
                  TestNum5 = random.Next(10, 100),
                  TestNum6 = random.Next(10, 100),
                  TestNum7 = random.Next(10, 100),
                  TestNum8 = random.Next(10, 100),
                  TestNum9 = random.Next(10, 100),
                  TestNum10 = random.Next(10, 100),
                  TestNum11 = random.Next(10, 100),
                  TestNum12 = random.Next(10, 100),
                  TestNum13 = random.Next(10, 100),
                  TestNum14 = random.Next(10, 100),
                  TestNum15 = random.Next(10, 100),
                  TestStr1 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestStr2 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestStr3 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestStr4 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestStr5 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestStr6 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestStr7 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestStr8 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestStr9 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestStr10 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestStr11 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestStr12 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestStr13 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestStr14 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestStr15 = $"sqlsugar{random.Next(1, 100).ToString()}",
                  TestDec1 = i + random.Next(1, 10000) / 3,
                  TestDec2 = i + random.Next(1, 10000) / 3,
                  TestDec3 = i + random.Next(1, 10000) / 3,
                  TestDec4 = i + random.Next(1, 10000) / 3,
                  TestDec5 = i + random.Next(1, 10000) / 3,
                  TestDec6 = i + random.Next(1, 10000) / 3,
                  TestDec7 = i + random.Next(1, 10000) / 3,
                  TestDec8 = i + random.Next(1, 10000) / 3,
                  TestDec9 = i + random.Next(1, 10000) / 3,
                  TestDec10 = i + random.Next(1, 10000) / 3,
                  TestDec11 = i + random.Next(1, 10000) / 3,
                  TestDec12 = i + random.Next(1, 10000) / 3,
                  TestDec13 = i + random.Next(1, 10000) / 3,
                  TestDec14 = i + random.Next(1, 10000) / 3,
                  TestDec15 = i + random.Next(1, 10000) / 3,
                  Salary = 5000 + (i % 2000) + random.Next(10),
                  Descript = $"sqlsugar初始創建"
              });
              lstobj3.Add(new Table.H_Test50C03
              {
                  Material = (900000 + i).ToString(),
                  Batch = (30000000 + i).ToString(),
                  TestNum1 = random.Next(10, 100),
                  TestNum2 = random.Next(10, 100),
                  TestNum3 = random.Next(10, 100),
                  TestNum4 = random.Next(10, 100),
                  TestNum5 = random.Next(10, 100),
                  TestNum6 = random.Next(10, 100),
                  TestNum7 = random.Next(10, 100),
                  TestNum8 = random.Next(10, 100),
                  TestNum9 = random.Next(10, 100),
                  TestNum10 = random.Next(10, 100),
                  TestNum11 = random.Next(10, 100),
                  TestNum12 = random.Next(10, 100),
                  TestNum13 = random.Next(10, 100),
                  TestNum14 = random.Next(10, 100),
                  TestNum15 = random.Next(10, 100),
                  TestStr1 = $"freesql{random.Next(1, 100).ToString()}",
                  TestStr2 = $"freesql{random.Next(1, 100).ToString()}",
                  TestStr3 = $"freesql{random.Next(1, 100).ToString()}",
                  TestStr4 = $"freesql{random.Next(1, 100).ToString()}",
                  TestStr5 = $"freesql{random.Next(1, 100).ToString()}",
                  TestStr6 = $"freesql{random.Next(1, 100).ToString()}",
                  TestStr7 = $"freesql{random.Next(1, 100).ToString()}",
                  TestStr8 = $"freesql{random.Next(1, 100).ToString()}",
                  TestStr9 = $"freesql{random.Next(1, 100).ToString()}",
                  TestStr10 = $"freesql{random.Next(1, 100).ToString()}",
                  TestStr11 = $"freesql{random.Next(1, 100).ToString()}",
                  TestStr12 = $"freesql{random.Next(1, 100).ToString()}",
                  TestStr13 = $"freesql{random.Next(1, 100).ToString()}",
                  TestStr14 = $"freesql{random.Next(1, 100).ToString()}",
                  TestStr15 = $"freesql{random.Next(1, 100).ToString()}",
                  TestDec1 = i + random.Next(1, 10000) / 3,
                  TestDec2 = i + random.Next(1, 10000) / 3,
                  TestDec3 = i + random.Next(1, 10000) / 3,
                  TestDec4 = i + random.Next(1, 10000) / 3,
                  TestDec5 = i + random.Next(1, 10000) / 3,
                  TestDec6 = i + random.Next(1, 10000) / 3,
                  TestDec7 = i + random.Next(1, 10000) / 3,
                  TestDec8 = i + random.Next(1, 10000) / 3,
                  TestDec9 = i + random.Next(1, 10000) / 3,
                  TestDec10 = i + random.Next(1, 10000) / 3,
                  TestDec11 = i + random.Next(1, 10000) / 3,
                  TestDec12 = i + random.Next(1, 10000) / 3,
                  TestDec13 = i + random.Next(1, 10000) / 3,
                  TestDec14 = i + random.Next(1, 10000) / 3,
                  TestDec15 = i + random.Next(1, 10000) / 3,
                  Salary = 5000 + (i % 2000) + random.Next(10),
                  Descript = $"freesql初始創建"
              });
          }

          //刪除測試表中的數據
          sqlClient.TrunCate("H_Test50C01").ExecCommand();
          sqlClient.TrunCate("H_Test50C02").ExecCommand();
          sqlClient.TrunCate("H_Test50C03").ExecCommand();

          Stopwatch sw = new Stopwatch();



          #region freesql
          sw.Reset();
          Console.WriteLine("------------------------------");
          Console.WriteLine("----------FreeSql 測試----------");
          Console.WriteLine($"FreeSql 預熱...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
          var temp3 = freeClient.Queryable<Table.H_Test50C03>().Where(w => w.TestDec1 < 0).ToList();
          Console.WriteLine($"FreeSql  正在插入數據\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
          sw.Start();
          freeClient.Insert<Table.H_Test50C03>(lstobj3).ExecuteAffrows();

          sw.Stop();
          Console.WriteLine($"FreeSql 數據插入{_count}條 耗時{sw.Elapsed}秒");
          sw.Reset();
          #endregion


          #region hisql
          sw.Reset();
          Console.WriteLine("------------------------------");
          Console.WriteLine("----------HiSql 測試----------");
          Console.WriteLine($"HiSql 預熱...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
          var temp1 = sqlClient.Query("H_Test50C01").Field("*").Take(1).Skip(1).ToDynamic();
          Console.WriteLine($"HiSql  正在插入數據\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
          sw.Start();
          sqlClient.Insert("H_Test50C01", lstobj).ExecCommand();
          sw.Stop();
          Console.WriteLine($"hisql 數據插入{_count}條 耗時{sw.Elapsed}秒");
          sw.Reset();
          #endregion






          #region sqlsugar
          sw.Reset();
          Console.WriteLine("------------------------------");
          Console.WriteLine("----------SqlSugar 測試----------");
          Console.WriteLine($"SqlSugar 預熱...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
          var temp2 = sugarClient.Queryable<Table.H_Test50C03>("H_Test50C03").Where(w => w.TestDec1 < 1).ToList();
          Console.WriteLine($"sqlsugar  正在插入數據\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
          sw.Start();
          sugarClient.Insertable(lstobj2).AS("H_Test50C03").ExecuteCommand();
          sw.Stop();
          Console.WriteLine($"sqlsugar 數據插入{_count}條 耗時{sw.Elapsed}秒");
          sw.Reset();
          #endregion
      }

測試結果

5條記錄10列以下測試結果截圖

5條記錄50列測試結果截圖

50條記錄10列以下測試結果截圖

50條記錄50列測試結果截圖

100條記錄10列以下測試結果截圖

100條記錄50列測試結果截圖

500條記錄10列以下測試結果截圖

500條記錄50列測試結果截圖

1000條記錄10列以下測試結果截圖

1000條記錄50列測試結果截圖

5000條記錄10列以下測試結果截圖

5000條記錄50列測試結果截圖

10000條記錄10列以下測試結果截圖

10000條記錄50列測就結果截圖

50000條記錄10列以下測試結果截圖

50000條記錄50列測試結果截圖

100000條記錄10列以下測試結果截圖

100000條記錄50列測試結果截圖

sqlsugar 在執行此操作時拋出異常
錯誤提示:System.Data.SqlClient.SqlException:“資源池“default”沒有足夠的系統記憶體來運行此查詢
在單獨只執行sqlsugar的測試樣例依然報此錯誤 通過分析sqlsugar的底層執行邏輯是因為它把所有的插入都拼成了一個插入sql文檔造成的

測試結果

sqlserver 批量(bulkcopy)數據插入測試

可能會有很多人認為如果大批量數據插入肯定不會用常規的方式插入應該用BulkCopy的方式插入,好,那麼我們再來測測基於資料庫廠商提供的SDK驅動自帶的BulkCopy再來對比一下三個框架的性能

10列以下批量插入的bulkcopy測試代碼

public static void TestSqlServerBulkCopy(int _count)
        {

            //hisql連接 請先配置好資料庫連接
            HiSqlClient sqlClient = Demo_Init.GetSqlClient();
            //hisql需要初始貨安裝 只需要執行一次
            sqlClient.CodeFirst.InstallHisql();


            //freesql連接
            IFreeSql freeClient = Demo_Init.GetFreeSqlClient();

            //sqlsugar連接
            SqlSugarClient sugarClient = Demo_Init.GetSugarClient();



            sqlClient.CodeFirst.CreateTable(typeof(Table.HTest01));

            Console.WriteLine("初始化hisql專用表成功!");

            sqlClient.CodeFirst.CreateTable(typeof(Table.HTest02));


            Console.WriteLine("初始化sqlsugar專用表成功!");


            sqlClient.CodeFirst.CreateTable(typeof(Table.HTest03));
            Console.WriteLine("初始化freesql專用表成功!");


            Console.WriteLine($"測試場景 Sqlserver  向表中插入{_count}條數據 BulkCopy方式插入");
            Console.WriteLine($"適用於大量數據導入場景");




            List<object> lstobj = new List<object>();
            List<Table.HTest02> lstobj2 = new List<Table.HTest02>();
            List<Table.HTest03> lstobj3 = new List<Table.HTest03>();
            Random random = new Random();

            //插入的參數值都隨機產生 以免資料庫執行相同SQL時會有緩存影響測試結果
            for (int i = 0; i < _count; i++)
            {
                //hisql可以用實體類也可以用匿名類
                lstobj.Add(new Table.HTest01 { SID = (i + 1), UName = $"hisql{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"hisql初始創建" });

                //sqlsugar用匿句類報錯用實體類
                lstobj2.Add(new Table.HTest02 { SID = (i + 1), UName = $"sqlsugar{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"sqlsugar初始創建" });
                lstobj3.Add(new Table.HTest03 { SID = (i + 1), UName = $"freesql{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"freesql初始創建" });
            }

            //刪除測試表中的數據
            sqlClient.TrunCate("HTest01").ExecCommand();
            sqlClient.TrunCate("HTest02").ExecCommand();
            sqlClient.TrunCate("HTest03").ExecCommand();

            Stopwatch sw = new Stopwatch();



            #region freesql
            sw.Reset();
            Console.WriteLine("------------------------------");
            Console.WriteLine("----------FreeSql 測試----------");
            Console.WriteLine($"FreeSql 預熱...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
            var temp3 = freeClient.Queryable<Table.HTest03>().Where(w => w.Age < 0).ToList();
            Console.WriteLine($"FreeSql  正在插入數據\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
            sw.Start();
            //freeClient.Insert<Table.HTest03>(lstobj3).ExecuteAffrows();
            freeClient.Insert<Table.HTest03>(lstobj3).ExecuteSqlBulkCopy();
            sw.Stop();
            Console.WriteLine($"FreeSql 數據插入{_count}條 耗時{sw.Elapsed}秒");
            sw.Reset();
            #endregion


            #region hisql
            sw.Reset();
            Console.WriteLine("------------------------------");
            Console.WriteLine("----------HiSql 測試----------");
            Console.WriteLine($"HiSql 預熱...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
            var temp1 = sqlClient.Query("HTest01").Field("*").Take(1).Skip(1).ToDynamic();
            Console.WriteLine($"HiSql  正在插入數據\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
            sw.Start();
            //sqlClient.Insert("HTest01", lstobj).ExecCommand();

            sqlClient.BulkCopyExecCommand("HTest01", lstobj);
            sw.Stop();
            Console.WriteLine($"hisql 數據插入{_count}條 耗時{sw.Elapsed}秒");
            sw.Reset();
            #endregion






            #region sqlsugar
            sw.Reset();
            Console.WriteLine("------------------------------");
            Console.WriteLine("----------SqlSugar 測試----------");
            Console.WriteLine($"SqlSugar 預熱...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
            var temp2 = sugarClient.Queryable<Table.HTest02>("HTest02").Where(w => w.Age < 1).ToList();
            Console.WriteLine($"sqlsugar  正在插入數據\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
            sw.Start();
            //sugarClient.Insertable(lstobj2).AS("HTest02").ExecuteCommand();
            sugarClient.Fastest<Table.HTest02>().BulkCopy(lstobj2);
            sw.Stop();
            Console.WriteLine($"sqlsugar 數據插入{_count}條 耗時{sw.Elapsed}秒");
            sw.Reset();
            #endregion
        }

50列批量插入的bulkcopy測試代碼

public static void TestSqlServer50ColInsert(int _count)
        {

            //hisql連接 請先配置好資料庫連接
            HiSqlClient sqlClient = Demo_Init.GetSqlClient();
            //hisql需要初始貨安裝 只需要執行一次
            sqlClient.CodeFirst.InstallHisql();


            //freesql連接
            IFreeSql freeClient = Demo_Init.GetFreeSqlClient();

            //sqlsugar連接
            SqlSugarClient sugarClient = Demo_Init.GetSugarClient();



            sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C01));

            Console.WriteLine("初始化hisql專用表成功!");

            sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C02));


            Console.WriteLine("初始化sqlsugar專用表成功!");


            sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C03));
            Console.WriteLine("初始化freesql專用表成功!");


            Console.WriteLine($"測試場景 Sqlserver  向表中插入{_count}條數據 50列 常規數據插入)");
            Console.WriteLine($"適用於大量數據導入場景");




            List<object> lstobj = new List<object>();
            List<Table.H_Test50C02> lstobj2 = new List<Table.H_Test50C02>();
            List<Table.H_Test50C03> lstobj3 = new List<Table.H_Test50C03>();
            Random random = new Random();

            //插入的參數值都隨機產生 以免資料庫執行相同SQL時會有緩存影響測試結果
            for (int i = 0; i < _count; i++)
            {
                //hisql可以用實體類也可以用匿名類
                lstobj.Add(new Table.H_Test50C01 { 
                    Material=(900000+i).ToString(),
                    Batch=(30000000+i).ToString(),
                    TestNum1= random.Next(10,100),
                    TestNum2 = random.Next(10, 100),
                    TestNum3 = random.Next(10, 100),
                    TestNum4 = random.Next(10, 100),
                    TestNum5 = random.Next(10, 100),
                    TestNum6 = random.Next(10, 100),
                    TestNum7 = random.Next(10, 100),
                    TestNum8 = random.Next(10, 100),
                    TestNum9 = random.Next(10, 100),
                    TestNum10 = random.Next(10, 100),
                    TestNum11 = random.Next(10, 100),
                    TestNum12 = random.Next(10, 100),
                    TestNum13= random.Next(10, 100),
                    TestNum14= random.Next(10, 100),
                    TestNum15= random.Next(10, 100),
                    TestStr1 = $"hisql{random.Next(1, 100).ToString()}",
                    TestStr2 = $"hisql{random.Next(1, 100).ToString()}",
                    TestStr3 = $"hisql{random.Next(1, 100).ToString()}",
                    TestStr4 = $"hisql{random.Next(1, 100).ToString()}",
                    TestStr5 = $"hisql{random.Next(1, 100).ToString()}",
                    TestStr6 = $"hisql{random.Next(1, 100).ToString()}",
                    TestStr7 = $"hisql{random.Next(1, 100).ToString()}",
                    TestStr8 = $"hisql{random.Next(1, 100).ToString()}",
                    TestStr9 = $"hisql{random.Next(1, 100).ToString()}",
                    TestStr10 = $"hisql{random.Next(1, 100).ToString()}",
                    TestStr11 = $"hisql{random.Next(1, 100).ToString()}",
                    TestStr12 = $"hisql{random.Next(1, 100).ToString()}",
                    TestStr13 = $"hisql{random.Next(1, 100).ToString()}",
                    TestStr14 = $"hisql{random.Next(1, 100).ToString()}",
                    TestStr15 = $"hisql{random.Next(1, 100).ToString()}",
                    TestDec1 = i+ random.Next(1, 10000)/3,
                    TestDec2 = i + random.Next(1, 10000) / 3,
                    TestDec3 = i + random.Next(1, 10000) / 3,
                    TestDec4 = i + random.Next(1, 10000) / 3,
                    TestDec5 = i + random.Next(1, 10000) / 3,
                    TestDec6 = i + random.Next(1, 10000) / 3,
                    TestDec7 = i + random.Next(1, 10000) / 3,
                    TestDec8 = i + random.Next(1, 10000) / 3,
                    TestDec9 = i + random.Next(1, 10000) / 3,
                    TestDec10 = i + random.Next(1, 10000) / 3,
                    TestDec11 = i + random.Next(1, 10000) / 3,
                    TestDec12 = i + random.Next(1, 10000) / 3,
                    TestDec13 = i + random.Next(1, 10000) / 3,
                    TestDec14 = i + random.Next(1, 10000) / 3,
                    TestDec15 = i + random.Next(1, 10000) / 3,
                    Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"hisql初始創建" });

                //sqlsugar用匿句類報錯用實體類
                lstobj2.Add(new Table.H_Test50C02
                {
                    Material = (900000 + i).ToString(),
                    Batch = (30000000 + i).ToString(),
                    TestNum1 = random.Next(10, 100),
                    TestNum2 = random.Next(10, 100),
                    TestNum3 = random.Next(10, 100),
                    TestNum4 = random.Next(10, 100),
                    TestNum5 = random.Next(10, 100),
                    TestNum6 = random.Next(10, 100),
                    TestNum7 = random.Next(10, 100),
                    TestNum8 = random.Next(10, 100),
                    TestNum9 = random.Next(10, 100),
                    TestNum10 = random.Next(10, 100),
                    TestNum11 = random.Next(10, 100),
                    TestNum12 = random.Next(10, 100),
                    TestNum13 = random.Next(10, 100),
                    TestNum14 = random.Next(10, 100),
                    TestNum15 = random.Next(10, 100),
                    TestStr1 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestStr2 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestStr3 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestStr4 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestStr5 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestStr6 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestStr7 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestStr8 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestStr9 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestStr10 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestStr11 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestStr12 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestStr13 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestStr14 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestStr15 = $"sqlsugar{random.Next(1, 100).ToString()}",
                    TestDec1 = i + random.Next(1, 10000) / 3,
                    TestDec2 = i + random.Next(1, 10000) / 3,
                    TestDec3 = i + random.Next(1, 10000) / 3,
                    TestDec4 = i + random.Next(1, 10000) / 3,
                    TestDec5 = i + random.Next(1, 10000) / 3,
                    TestDec6 = i + random.Next(1, 10000) / 3,
                    TestDec7 = i + random.Next(1, 10000) / 3,
                    TestDec8 = i + random.Next(1, 10000) / 3,
                    TestDec9 = i + random.Next(1, 10000) / 3,
                    TestDec10 = i + random.Next(1, 10000) / 3,
                    TestDec11 = i + random.Next(1, 10000) / 3,
                    TestDec12 = i + random.Next(1, 10000) / 3,
                    TestDec13 = i + random.Next(1, 10000) / 3,
                    TestDec14 = i + random.Next(1, 10000) / 3,
                    TestDec15 = i + random.Next(1, 10000) / 3,
                    Salary = 5000 + (i % 2000) + random.Next(10),
                    Descript = $"sqlsugar初始創建"
                });
                lstobj3.Add(new Table.H_Test50C03
                {
                    Material = (900000 + i).ToString(),
                    Batch = (30000000 + i).ToString(),
                    TestNum1 = random.Next(10, 100),
                    TestNum2 = random.Next(10, 100),
                    TestNum3 = random.Next(10, 100),
                    TestNum4 = random.Next(10, 100),
                    TestNum5 = random.Next(10, 100),
                    TestNum6 = random.Next(10, 100),
                    TestNum7 = random.Next(10, 100),
                    TestNum8 = random.Next(10, 100),
                    TestNum9 = random.Next(10, 100),
                    TestNum10 = random.Next(10, 100),
                    TestNum11 = random.Next(10, 100),
                    TestNum12 = random.Next(10, 100),
                    TestNum13 = random.Next(10, 100),
                    TestNum14 = random.Next(10, 100),
                    TestNum15 = random.Next(10, 100),
                    TestStr1 = $"freesql{random.Next(1, 100).ToString()}",
                    TestStr2 = $"freesql{random.Next(1, 100).ToString()}",
                    TestStr3 = $"freesql{random.Next(1, 100).ToString()}",
                    TestStr4 = $"freesql{random.Next(1, 100).ToString()}",
                    TestStr5 = $"freesql{random.Next(1, 100).ToString()}",
                    TestStr6 = $"freesql{random.Next(1, 100).ToString()}",
                    TestStr7 = $"freesql{random.Next(1, 100).ToString()}",
                    TestStr8 = $"freesql{random.Next(1, 100).ToString()}",
                    TestStr9 = $"freesql{random.Next(1, 100).ToString()}",
                    TestStr10 = $"freesql{random.Next(1, 100).ToString()}",
                    TestStr11 = $"freesql{random.Next(1, 100).ToString()}",
                    TestStr12 = $"freesql{random.Next(1, 100).ToString()}",
                    TestStr13 = $"freesql{random.Next(1, 100).ToString()}",
                    TestStr14 = $"freesql{random.Next(1, 100).ToString()}",
                    TestStr15 = $"freesql{random.Next(1, 100).ToString()}",
                    TestDec1 = i + random.Next(1, 10000) / 3,
                    TestDec2 = i + random.Next(1, 10000) / 3,
                    TestDec3 = i + random.Next(1, 10000) / 3,
                    TestDec4 = i + random.Next(1, 10000) / 3,
                    TestDec5 = i + random.Next(1, 10000) / 3,
                    TestDec6 = i + random.Next(1, 10000) / 3,
                    TestDec7 = i + random.Next(1, 10000) / 3,
                    TestDec8 = i + random.Next(1, 10000) / 3,
                    TestDec9 = i + random.Next(1, 10000) / 3,
                    TestDec10 = i + random.Next(1, 10000) / 3,
                    TestDec11 = i + random.Next(1, 10000) / 3,
                    TestDec12 = i + random.Next(1, 10000) / 3,
                    TestDec13 = i + random.Next(1, 10000) / 3,
                    TestDec14 = i + random.Next(1, 10000) / 3,
                    TestDec15 = i + random.Next(1, 10000) / 3,
                    Salary = 5000 + (i % 2000) + random.Next(10),
                    Descript = $"freesql初始創建"
                });
            }

            //刪除測試表中的數據
            sqlClient.TrunCate("H_Test50C01").ExecCommand();
            sqlClient.TrunCate("H_Test50C02").ExecCommand();
            sqlClient.TrunCate("H_Test50C03").ExecCommand();

            Stopwatch sw = new Stopwatch();



            #region freesql
            sw.Reset();
            Console.WriteLine("------------------------------");
            Console.WriteLine("----------FreeSql 測試----------");
            Console.WriteLine($"FreeSql 預熱...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
            var temp3 = freeClient.Queryable<Table.H_Test50C03>().Where(w => w.TestDec1 < 0).ToList();
            Console.WriteLine($"FreeSql  正在插入數據\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
            sw.Start();
            freeClient.Insert<Table.H_Test50C03>(lstobj3).ExecuteAffrows();

            sw.Stop();
            Console.WriteLine($"FreeSql 數據插入{_count}條 耗時{sw.Elapsed}秒");
            sw.Reset();
            #endregion


            #region hisql
            sw.Reset();
            Console.WriteLine("------------------------------");
            Console.WriteLine("----------HiSql 測試----------");
            Console.WriteLine($"HiSql 預熱...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
            var temp1 = sqlClient.Query("H_Test50C01").Field("*").Take(1).Skip(1).ToDynamic();
            Console.WriteLine($"HiSql  正在插入數據\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
            sw.Start();
            sqlClient.Insert("H_Test50C01", lstobj).ExecCommand();
            sw.Stop();
            Console.WriteLine($"hisql 數據插入{_count}條 耗時{sw.Elapsed}秒");
            sw.Reset();
            #endregion






            #region sqlsugar
            sw.Reset();
            Console.WriteLine("------------------------------");
            Console.WriteLine("----------SqlSugar 測試----------");
            Console.WriteLine($"SqlSugar 預熱...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
            var temp2 = sugarClient.Queryable<Table.H_Test50C03>("H_Test50C03").Where(w => w.TestDec1 < 1).ToList();
            Console.WriteLine($"sqlsugar  正在插入數據\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
            sw.Start();
            sugarClient.Insertable(lstobj2).AS("H_Test50C03").ExecuteCommand();
            sw.Stop();
            Console.WriteLine($"sqlsugar 數據插入{_count}條 耗時{sw.Elapsed}秒");
            sw.Reset();
            #endregion
        }

測試結果

1W條數據10列以下欄位bulkcopy插入測試

1W條數據50列欄位bulkcopy插入測試

5W條數據10列以下欄位bulkcpy插入測試

5W條數據50列欄位bulkcopy插入測試

10W條數據10列以下欄位Bulkcopy插入測試

10W條數據50列欄位bulkcopy插入測試

20w條數據10列以下欄位bulkcopy插入測試

20w條數據50列欄位bulkcopy插入測試

50w條數據10列欄位Bulkcopy插入測試

50w條數據50列欄位BulkCopy插入測試

100W條10列以下欄位bulkCopy插入測試

100W條數據50列欄位bulkcopy插入測試

測試結果

總結

我想不用總結了 三個ORM不管是按常規插入和bulkcopy插入誰快認慢一目瞭然,不過我還是想貼上以下圖


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 我們在學習機器學習相關內容時,一般是不需要我們自己去爬取數據的,因為很多的演算法學習很友好的幫助我們打包好了相關數據,但是這並不代表我們不需要進行學習和瞭解相關知識。在這裡我們瞭解三種數據的爬取:鮮花/明星圖像的爬取、中國藝人圖像的爬取、股票數據的爬取。分別對著三種爬蟲進行學習和使用。 體會 個 ...
  • 03數值計算(V) 1. 計算矩形面積 類型:數值運算 描述 用戶輸入矩形的長和寬,計算其面積並輸出。 a = eval(input()) #輸入整數字元串,轉換為整數;輸入浮點數字元串,轉換為浮點數 b = float(input()) #輸入整數和浮點數,都轉換為浮點數 c = int(inpu ...
  • python基礎02 條件控制 python條件語句是通過一條或多條語句的執行結果(Ture或者False)來執行的代碼塊 python中用elif代替了else if,所以if語句的關鍵字為:if-elif-else。 註意 每個條件後面都要用冒號:,表示接下來是滿足條件後要執行的語句塊 使用縮進 ...
  • 1、opencc-python 首先介紹opencc中的Python實現庫,它具有安裝簡單,翻譯準確,使用方便等優點。對於我們日常的需求完全能夠勝任。 1.1安裝opencc-python 首先在terminal中安裝opencc-python。 pip install opencc-python ...
  • 人生苦短,我用Python~某寶秒殺,用毫秒級的精準度來搶購!你還在為各種活動秒殺 搶不過別人而煩惱嗎?今天出一期 利用Python搶購秒殺商品的文章 目錄 ​ 項目環境 某寶搶購流程分析 程式實現思路 代碼實踐與梳理 項目環境 ​ 操作系統:Windows 10 開發環境:python3.7 ID ...
  • #數據類型的擴展 P24 ##1.整數擴展 ###進位: 二級制:0b 十進位:無 八進位:0 十六進位:0x 代碼: int i = 10; int i2 = 010; int i3 = 0x10; System.out.println(i); System.out.println(i2); Sy ...
  • 前言 相比大家都聽過自動化生產線、自動化辦公等辭彙,在沒有人工干預的情況下,機器可以自己完成各項任務,這大大提升了工作 效率。 編程世界里有各種各樣的自動化腳本,來完成不同的任務。 尤其Python非常適合編寫自動化腳本,因為它語法簡潔易懂,而且有豐富的第三方工具庫。 這次我們使用Python來實現 ...
  • 1. JVM的位置 JVM是運行在操作系統之上的。 2. JVM體繫結構 3. 類載入器 類載入器的作用:載入class文件 載入器:①.ApplicationClassLoader應用程式類載入器,主要負責載入當前應用classpath路徑下的所有類; ②.ExtentionClassLoader ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...