c# sqlsugar,hisql,freesql orm框架全方位性能测试对比 sqlserver 性能测试 ...

打印 上一主题 下一主题

主题 645|帖子 645|积分 1935

在2022年1月份本人做过一次sqlsugar,hisql,freesql三个框架的性能测试,上次主要是测的sqlserver下的常规插入(非bulkcopy的方式数据插入),hisql与目前比较流行的ORM框架性能测试对比 时间已经过半年,这次我就测的更完整点测试方案如下
2022.6.23 修改
发了此篇测试后受到了某知名ORM作者的威胁

再次声明本测试是基于我的电脑环境多次测试的结果,已经开放了测试源代码 ,不针对于任何ORM品牌, 后期将会对Dapper和efcore测试
删贴? 那是不可能的,有测试源码 快与慢大家自己评定
如果开源框架不能接受别人的测试 那么最好闭源。而不是叫人删贴
测试方案


  • 测试四种数据库(sqlserver,mysql,oralce,postgresql) 每种数据库写一遍测试文章
  • 常规插入和批量插入
  • 数据量从5条到100W间的数据插入
  • 数据列从5列和50列的各种数据类型场景
  • 开源测试代码供各位网友查看审核是否测试公平公正
测试源码https://github.com/tansar/HiSqlTestDemo
测试环境

操作系统环境


sqlserver 环境


mysql 环境


oracle 环境


postgresql 环境


sqlserver 常规数据插入测试

10列以下字段测试代码如下
  1.   public static void TestSqlServerInsert(int _count)
  2.         {
  3.       //hisql连接 请先配置好数据库连接
  4.       HiSqlClient sqlClient = Demo_Init.GetSqlClient();
  5.       //hisql需要初始货安装 只需要执行一次
  6.       sqlClient.CodeFirst.InstallHisql();
  7.       //freesql连接
  8.       IFreeSql freeClient = Demo_Init.GetFreeSqlClient();
  9.       //sqlsugar连接
  10.       SqlSugarClient sugarClient = Demo_Init.GetSugarClient();
  11.       
  12.       sqlClient.CodeFirst.CreateTable(typeof(Table.HTest01));
  13.       Console.WriteLine("初始化hisql专用表成功!");
  14.       sqlClient.CodeFirst.CreateTable(typeof(Table.HTest02));
  15.       Console.WriteLine("初始化sqlsugar专用表成功!");
  16.       sqlClient.CodeFirst.CreateTable(typeof(Table.HTest03));
  17.       Console.WriteLine("初始化freesql专用表成功!");
  18.       Console.WriteLine($"测试场景 Sqlserver  向表中插入{_count}条数据 常规数据插入)");
  19.       Console.WriteLine($"用常规数据插入最适应日常应用场景");
  20.       List<object> lstobj = new List<object>();
  21.       List<Table.HTest02> lstobj2 = new List<Table.HTest02>();
  22.       List<Table.HTest03> lstobj3 = new List<Table.HTest03>();
  23.       Random random = new Random();
  24.       //插入的参数值都随机产生 以免数据库执行相同SQL时会有缓存影响测试结果
  25.       for (int i = 0; i < _count; i++)
  26.       {
  27.           //hisql可以用实体类也可以用匿名类
  28.           lstobj.Add(new Table.HTest01 { SID = (i + 1), UName = $"hisql{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"hisql初始创建" });
  29.           //sqlsugar用匿句类报错用实体类
  30.           lstobj2.Add(new Table.HTest02 { SID = (i + 1), UName = $"sqlsugar{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"sqlsugar初始创建" });
  31.           lstobj3.Add(new Table.HTest03 { SID = (i + 1), UName = $"freesql{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"freesql初始创建" });
  32.       }
  33.       //删除测试表中的数据
  34.       sqlClient.TrunCate("HTest01").ExecCommand();
  35.       sqlClient.TrunCate("HTest02").ExecCommand();
  36.       sqlClient.TrunCate("HTest03").ExecCommand();
  37.       Stopwatch sw = new Stopwatch();
  38.       #region freesql
  39.       sw.Reset();
  40.       Console.WriteLine("------------------------------");
  41.       Console.WriteLine("----------FreeSql 测试----------");
  42.       Console.WriteLine($"FreeSql 预热...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  43.       var temp3 = freeClient.Queryable<Table.HTest03>().Where(w => w.Age < 0).ToList();
  44.       Console.WriteLine($"FreeSql  正在插入数据\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  45.       sw.Start();
  46.       freeClient.Insert<Table.HTest03>(lstobj3).ExecuteAffrows();
  47.       
  48.       sw.Stop();
  49.       Console.WriteLine($"FreeSql 数据插入{_count}条 耗时{sw.Elapsed}秒");
  50.       sw.Reset();
  51.       #endregion
  52.       #region hisql
  53.       sw.Reset();
  54.       Console.WriteLine("------------------------------");
  55.       Console.WriteLine("----------HiSql 测试----------");
  56.       Console.WriteLine($"HiSql 预热...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  57.       var temp1 = sqlClient.Query("HTest01").Field("*").Take(1).Skip(1).ToDynamic();
  58.       Console.WriteLine($"HiSql  正在插入数据\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  59.       sw.Start();
  60.       sqlClient.Insert("HTest01", lstobj).ExecCommand();
  61.       sw.Stop();
  62.       Console.WriteLine($"hisql 数据插入{_count}条 耗时{sw.Elapsed}秒");
  63.       sw.Reset();
  64.       #endregion
复制代码
50列字段测试代码如下
  1.   public static void TestSqlServer50ColInsert(int _count)
  2.         {
  3.             //hisql连接 请先配置好数据库连接
  4.           HiSqlClient sqlClient = Demo_Init.GetSqlClient();
  5.           //hisql需要初始货安装 只需要执行一次
  6.           sqlClient.CodeFirst.InstallHisql();
  7.           //freesql连接
  8.           IFreeSql freeClient = Demo_Init.GetFreeSqlClient();
  9.           //sqlsugar连接
  10.           SqlSugarClient sugarClient = Demo_Init.GetSugarClient();
  11.           sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C01));
  12.           Console.WriteLine("初始化hisql专用表成功!");
  13.           sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C02));
  14.           Console.WriteLine("初始化sqlsugar专用表成功!");
  15.           sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C03));
  16.           Console.WriteLine("初始化freesql专用表成功!");
  17.           Console.WriteLine($"测试场景 Sqlserver  向表中插入{_count}条数据 50列 常规数据插入)");
  18.           Console.WriteLine($"用常规数据插入最适应日常应用场景");
  19.           List<object> lstobj = new List<object>();
  20.           List<Table.H_Test50C02> lstobj2 = new List<Table.H_Test50C02>();
  21.           List<Table.H_Test50C03> lstobj3 = new List<Table.H_Test50C03>();
  22.           Random random = new Random();
  23.           //插入的参数值都随机产生 以免数据库执行相同SQL时会有缓存影响测试结果
  24.           for (int i = 0; i < _count; i++)
  25.           {
  26.               //hisql可以用实体类也可以用匿名类
  27.               lstobj.Add(new Table.H_Test50C01 {
  28.                   Material=(900000+i).ToString(),
  29.                   Batch=(30000000+i).ToString(),
  30.                   TestNum1= random.Next(10,100),
  31.                   TestNum2 = random.Next(10, 100),
  32.                   TestNum3 = random.Next(10, 100),
  33.                   TestNum4 = random.Next(10, 100),
  34.                   TestNum5 = random.Next(10, 100),
  35.                   TestNum6 = random.Next(10, 100),
  36.                   TestNum7 = random.Next(10, 100),
  37.                   TestNum8 = random.Next(10, 100),
  38.                   TestNum9 = random.Next(10, 100),
  39.                   TestNum10 = random.Next(10, 100),
  40.                   TestNum11 = random.Next(10, 100),
  41.                   TestNum12 = random.Next(10, 100),
  42.                   TestNum13= random.Next(10, 100),
  43.                   TestNum14= random.Next(10, 100),
  44.                   TestNum15= random.Next(10, 100),
  45.                   TestStr1 = $"hisql{random.Next(1, 100).ToString()}",
  46.                   TestStr2 = $"hisql{random.Next(1, 100).ToString()}",
  47.                   TestStr3 = $"hisql{random.Next(1, 100).ToString()}",
  48.                   TestStr4 = $"hisql{random.Next(1, 100).ToString()}",
  49.                   TestStr5 = $"hisql{random.Next(1, 100).ToString()}",
  50.                   TestStr6 = $"hisql{random.Next(1, 100).ToString()}",
  51.                   TestStr7 = $"hisql{random.Next(1, 100).ToString()}",
  52.                   TestStr8 = $"hisql{random.Next(1, 100).ToString()}",
  53.                   TestStr9 = $"hisql{random.Next(1, 100).ToString()}",
  54.                   TestStr10 = $"hisql{random.Next(1, 100).ToString()}",
  55.                   TestStr11 = $"hisql{random.Next(1, 100).ToString()}",
  56.                   TestStr12 = $"hisql{random.Next(1, 100).ToString()}",
  57.                   TestStr13 = $"hisql{random.Next(1, 100).ToString()}",
  58.                   TestStr14 = $"hisql{random.Next(1, 100).ToString()}",
  59.                   TestStr15 = $"hisql{random.Next(1, 100).ToString()}",
  60.                   TestDec1 = i+ random.Next(1, 10000)/3,
  61.                   TestDec2 = i + random.Next(1, 10000) / 3,
  62.                   TestDec3 = i + random.Next(1, 10000) / 3,
  63.                   TestDec4 = i + random.Next(1, 10000) / 3,
  64.                   TestDec5 = i + random.Next(1, 10000) / 3,
  65.                   TestDec6 = i + random.Next(1, 10000) / 3,
  66.                   TestDec7 = i + random.Next(1, 10000) / 3,
  67.                   TestDec8 = i + random.Next(1, 10000) / 3,
  68.                   TestDec9 = i + random.Next(1, 10000) / 3,
  69.                   TestDec10 = i + random.Next(1, 10000) / 3,
  70.                   TestDec11 = i + random.Next(1, 10000) / 3,
  71.                   TestDec12 = i + random.Next(1, 10000) / 3,
  72.                   TestDec13 = i + random.Next(1, 10000) / 3,
  73.                   TestDec14 = i + random.Next(1, 10000) / 3,
  74.                   TestDec15 = i + random.Next(1, 10000) / 3,
  75.                   Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"hisql初始创建" });
  76.               //sqlsugar用匿句类报错用实体类
  77.               lstobj2.Add(new Table.H_Test50C02
  78.               {
  79.                   Material = (900000 + i).ToString(),
  80.                   Batch = (30000000 + i).ToString(),
  81.                   TestNum1 = random.Next(10, 100),
  82.                   TestNum2 = random.Next(10, 100),
  83.                   TestNum3 = random.Next(10, 100),
  84.                   TestNum4 = random.Next(10, 100),
  85.                   TestNum5 = random.Next(10, 100),
  86.                   TestNum6 = random.Next(10, 100),
  87.                   TestNum7 = random.Next(10, 100),
  88.                   TestNum8 = random.Next(10, 100),
  89.                   TestNum9 = random.Next(10, 100),
  90.                   TestNum10 = random.Next(10, 100),
  91.                   TestNum11 = random.Next(10, 100),
  92.                   TestNum12 = random.Next(10, 100),
  93.                   TestNum13 = random.Next(10, 100),
  94.                   TestNum14 = random.Next(10, 100),
  95.                   TestNum15 = random.Next(10, 100),
  96.                   TestStr1 = $"sqlsugar{random.Next(1, 100).ToString()}",
  97.                   TestStr2 = $"sqlsugar{random.Next(1, 100).ToString()}",
  98.                   TestStr3 = $"sqlsugar{random.Next(1, 100).ToString()}",
  99.                   TestStr4 = $"sqlsugar{random.Next(1, 100).ToString()}",
  100.                   TestStr5 = $"sqlsugar{random.Next(1, 100).ToString()}",
  101.                   TestStr6 = $"sqlsugar{random.Next(1, 100).ToString()}",
  102.                   TestStr7 = $"sqlsugar{random.Next(1, 100).ToString()}",
  103.                   TestStr8 = $"sqlsugar{random.Next(1, 100).ToString()}",
  104.                   TestStr9 = $"sqlsugar{random.Next(1, 100).ToString()}",
  105.                   TestStr10 = $"sqlsugar{random.Next(1, 100).ToString()}",
  106.                   TestStr11 = $"sqlsugar{random.Next(1, 100).ToString()}",
  107.                   TestStr12 = $"sqlsugar{random.Next(1, 100).ToString()}",
  108.                   TestStr13 = $"sqlsugar{random.Next(1, 100).ToString()}",
  109.                   TestStr14 = $"sqlsugar{random.Next(1, 100).ToString()}",
  110.                   TestStr15 = $"sqlsugar{random.Next(1, 100).ToString()}",
  111.                   TestDec1 = i + random.Next(1, 10000) / 3,
  112.                   TestDec2 = i + random.Next(1, 10000) / 3,
  113.                   TestDec3 = i + random.Next(1, 10000) / 3,
  114.                   TestDec4 = i + random.Next(1, 10000) / 3,
  115.                   TestDec5 = i + random.Next(1, 10000) / 3,
  116.                   TestDec6 = i + random.Next(1, 10000) / 3,
  117.                   TestDec7 = i + random.Next(1, 10000) / 3,
  118.                   TestDec8 = i + random.Next(1, 10000) / 3,
  119.                   TestDec9 = i + random.Next(1, 10000) / 3,
  120.                   TestDec10 = i + random.Next(1, 10000) / 3,
  121.                   TestDec11 = i + random.Next(1, 10000) / 3,
  122.                   TestDec12 = i + random.Next(1, 10000) / 3,
  123.                   TestDec13 = i + random.Next(1, 10000) / 3,
  124.                   TestDec14 = i + random.Next(1, 10000) / 3,
  125.                   TestDec15 = i + random.Next(1, 10000) / 3,
  126.                   Salary = 5000 + (i % 2000) + random.Next(10),
  127.                   Descript = $"sqlsugar初始创建"
  128.               });
  129.               lstobj3.Add(new Table.H_Test50C03
  130.               {
  131.                   Material = (900000 + i).ToString(),
  132.                   Batch = (30000000 + i).ToString(),
  133.                   TestNum1 = random.Next(10, 100),
  134.                   TestNum2 = random.Next(10, 100),
  135.                   TestNum3 = random.Next(10, 100),
  136.                   TestNum4 = random.Next(10, 100),
  137.                   TestNum5 = random.Next(10, 100),
  138.                   TestNum6 = random.Next(10, 100),
  139.                   TestNum7 = random.Next(10, 100),
  140.                   TestNum8 = random.Next(10, 100),
  141.                   TestNum9 = random.Next(10, 100),
  142.                   TestNum10 = random.Next(10, 100),
  143.                   TestNum11 = random.Next(10, 100),
  144.                   TestNum12 = random.Next(10, 100),
  145.                   TestNum13 = random.Next(10, 100),
  146.                   TestNum14 = random.Next(10, 100),
  147.                   TestNum15 = random.Next(10, 100),
  148.                   TestStr1 = $"freesql{random.Next(1, 100).ToString()}",
  149.                   TestStr2 = $"freesql{random.Next(1, 100).ToString()}",
  150.                   TestStr3 = $"freesql{random.Next(1, 100).ToString()}",
  151.                   TestStr4 = $"freesql{random.Next(1, 100).ToString()}",
  152.                   TestStr5 = $"freesql{random.Next(1, 100).ToString()}",
  153.                   TestStr6 = $"freesql{random.Next(1, 100).ToString()}",
  154.                   TestStr7 = $"freesql{random.Next(1, 100).ToString()}",
  155.                   TestStr8 = $"freesql{random.Next(1, 100).ToString()}",
  156.                   TestStr9 = $"freesql{random.Next(1, 100).ToString()}",
  157.                   TestStr10 = $"freesql{random.Next(1, 100).ToString()}",
  158.                   TestStr11 = $"freesql{random.Next(1, 100).ToString()}",
  159.                   TestStr12 = $"freesql{random.Next(1, 100).ToString()}",
  160.                   TestStr13 = $"freesql{random.Next(1, 100).ToString()}",
  161.                   TestStr14 = $"freesql{random.Next(1, 100).ToString()}",
  162.                   TestStr15 = $"freesql{random.Next(1, 100).ToString()}",
  163.                   TestDec1 = i + random.Next(1, 10000) / 3,
  164.                   TestDec2 = i + random.Next(1, 10000) / 3,
  165.                   TestDec3 = i + random.Next(1, 10000) / 3,
  166.                   TestDec4 = i + random.Next(1, 10000) / 3,
  167.                   TestDec5 = i + random.Next(1, 10000) / 3,
  168.                   TestDec6 = i + random.Next(1, 10000) / 3,
  169.                   TestDec7 = i + random.Next(1, 10000) / 3,
  170.                   TestDec8 = i + random.Next(1, 10000) / 3,
  171.                   TestDec9 = i + random.Next(1, 10000) / 3,
  172.                   TestDec10 = i + random.Next(1, 10000) / 3,
  173.                   TestDec11 = i + random.Next(1, 10000) / 3,
  174.                   TestDec12 = i + random.Next(1, 10000) / 3,
  175.                   TestDec13 = i + random.Next(1, 10000) / 3,
  176.                   TestDec14 = i + random.Next(1, 10000) / 3,
  177.                   TestDec15 = i + random.Next(1, 10000) / 3,
  178.                   Salary = 5000 + (i % 2000) + random.Next(10),
  179.                   Descript = $"freesql初始创建"
  180.               });
  181.           }
  182.           //删除测试表中的数据
  183.           sqlClient.TrunCate("H_Test50C01").ExecCommand();
  184.           sqlClient.TrunCate("H_Test50C02").ExecCommand();
  185.           sqlClient.TrunCate("H_Test50C03").ExecCommand();
  186.           Stopwatch sw = new Stopwatch();
  187.           #region freesql
  188.           sw.Reset();
  189.           Console.WriteLine("------------------------------");
  190.           Console.WriteLine("----------FreeSql 测试----------");
  191.           Console.WriteLine($"FreeSql 预热...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  192.           var temp3 = freeClient.Queryable<Table.H_Test50C03>().Where(w => w.TestDec1 < 0).ToList();
  193.           Console.WriteLine($"FreeSql  正在插入数据\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  194.           sw.Start();
  195.           freeClient.Insert<Table.H_Test50C03>(lstobj3).ExecuteAffrows();
  196.           sw.Stop();
  197.           Console.WriteLine($"FreeSql 数据插入{_count}条 耗时{sw.Elapsed}秒");
  198.           sw.Reset();
  199.           #endregion
  200.           #region hisql
  201.           sw.Reset();
  202.           Console.WriteLine("------------------------------");
  203.           Console.WriteLine("----------HiSql 测试----------");
  204.           Console.WriteLine($"HiSql 预热...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  205.           var temp1 = sqlClient.Query("H_Test50C01").Field("*").Take(1).Skip(1).ToDynamic();
  206.           Console.WriteLine($"HiSql  正在插入数据\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  207.           sw.Start();
  208.           sqlClient.Insert("H_Test50C01", lstobj).ExecCommand();
  209.           sw.Stop();
  210.           Console.WriteLine($"hisql 数据插入{_count}条 耗时{sw.Elapsed}秒");
  211.           sw.Reset();
  212.           #endregion
  213.           #region sqlsugar
  214.           sw.Reset();
  215.           Console.WriteLine("------------------------------");
  216.           Console.WriteLine("----------SqlSugar 测试----------");
  217.           Console.WriteLine($"SqlSugar 预热...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  218.           var temp2 = sugarClient.Queryable<Table.H_Test50C03>("H_Test50C03").Where(w => w.TestDec1 < 1).ToList();
  219.           Console.WriteLine($"sqlsugar  正在插入数据\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  220.           sw.Start();
  221.           sugarClient.Insertable(lstobj2).AS("H_Test50C03").ExecuteCommand();
  222.           sw.Stop();
  223.           Console.WriteLine($"sqlsugar 数据插入{_count}条 耗时{sw.Elapsed}秒");
  224.           sw.Reset();
  225.           #endregion
  226.       }
复制代码
测试结果

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测试代码
  1. public static void TestSqlServerBulkCopy(int _count)
  2.         {
  3.             //hisql连接 请先配置好数据库连接
  4.             HiSqlClient sqlClient = Demo_Init.GetSqlClient();
  5.             //hisql需要初始货安装 只需要执行一次
  6.             sqlClient.CodeFirst.InstallHisql();
  7.             //freesql连接
  8.             IFreeSql freeClient = Demo_Init.GetFreeSqlClient();
  9.             //sqlsugar连接
  10.             SqlSugarClient sugarClient = Demo_Init.GetSugarClient();
  11.             sqlClient.CodeFirst.CreateTable(typeof(Table.HTest01));
  12.             Console.WriteLine("初始化hisql专用表成功!");
  13.             sqlClient.CodeFirst.CreateTable(typeof(Table.HTest02));
  14.             Console.WriteLine("初始化sqlsugar专用表成功!");
  15.             sqlClient.CodeFirst.CreateTable(typeof(Table.HTest03));
  16.             Console.WriteLine("初始化freesql专用表成功!");
  17.             Console.WriteLine($"测试场景 Sqlserver  向表中插入{_count}条数据 BulkCopy方式插入");
  18.             Console.WriteLine($"适用于大量数据导入场景");
  19.             List<object> lstobj = new List<object>();
  20.             List<Table.HTest02> lstobj2 = new List<Table.HTest02>();
  21.             List<Table.HTest03> lstobj3 = new List<Table.HTest03>();
  22.             Random random = new Random();
  23.             //插入的参数值都随机产生 以免数据库执行相同SQL时会有缓存影响测试结果
  24.             for (int i = 0; i < _count; i++)
  25.             {
  26.                 //hisql可以用实体类也可以用匿名类
  27.                 lstobj.Add(new Table.HTest01 { SID = (i + 1), UName = $"hisql{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"hisql初始创建" });
  28.                 //sqlsugar用匿句类报错用实体类
  29.                 lstobj2.Add(new Table.HTest02 { SID = (i + 1), UName = $"sqlsugar{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"sqlsugar初始创建" });
  30.                 lstobj3.Add(new Table.HTest03 { SID = (i + 1), UName = $"freesql{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"freesql初始创建" });
  31.             }
  32.             //删除测试表中的数据
  33.             sqlClient.TrunCate("HTest01").ExecCommand();
  34.             sqlClient.TrunCate("HTest02").ExecCommand();
  35.             sqlClient.TrunCate("HTest03").ExecCommand();
  36.             Stopwatch sw = new Stopwatch();
  37.             #region freesql
  38.             sw.Reset();
  39.             Console.WriteLine("------------------------------");
  40.             Console.WriteLine("----------FreeSql 测试----------");
  41.             Console.WriteLine($"FreeSql 预热...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  42.             var temp3 = freeClient.Queryable<Table.HTest03>().Where(w => w.Age < 0).ToList();
  43.             Console.WriteLine($"FreeSql  正在插入数据\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  44.             sw.Start();
  45.             //freeClient.Insert<Table.HTest03>(lstobj3).ExecuteAffrows();
  46.             freeClient.Insert<Table.HTest03>(lstobj3).ExecuteSqlBulkCopy();
  47.             sw.Stop();
  48.             Console.WriteLine($"FreeSql 数据插入{_count}条 耗时{sw.Elapsed}秒");
  49.             sw.Reset();
  50.             #endregion
  51.             #region hisql
  52.             sw.Reset();
  53.             Console.WriteLine("------------------------------");
  54.             Console.WriteLine("----------HiSql 测试----------");
  55.             Console.WriteLine($"HiSql 预热...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  56.             var temp1 = sqlClient.Query("HTest01").Field("*").Take(1).Skip(1).ToDynamic();
  57.             Console.WriteLine($"HiSql  正在插入数据\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  58.             sw.Start();
  59.             //sqlClient.Insert("HTest01", lstobj).ExecCommand();
  60.             sqlClient.BulkCopyExecCommand("HTest01", lstobj);
  61.             sw.Stop();
  62.             Console.WriteLine($"hisql 数据插入{_count}条 耗时{sw.Elapsed}秒");
  63.             sw.Reset();
  64.             #endregion
  65.             #region sqlsugar
  66.             sw.Reset();
  67.             Console.WriteLine("------------------------------");
  68.             Console.WriteLine("----------SqlSugar 测试----------");
  69.             Console.WriteLine($"SqlSugar 预热...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  70.             var temp2 = sugarClient.Queryable<Table.HTest02>("HTest02").Where(w => w.Age < 1).ToList();
  71.             Console.WriteLine($"sqlsugar  正在插入数据\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  72.             sw.Start();
  73.             //sugarClient.Insertable(lstobj2).AS("HTest02").ExecuteCommand();
  74.             sugarClient.Fastest<Table.HTest02>().BulkCopy(lstobj2);
  75.             sw.Stop();
  76.             Console.WriteLine($"sqlsugar 数据插入{_count}条 耗时{sw.Elapsed}秒");
  77.             sw.Reset();
  78.             #endregion
  79.         }
复制代码
50列批量插入的bulkcopy测试代码
  1. public static void TestSqlServer50ColInsert(int _count)
  2.         {
  3.             //hisql连接 请先配置好数据库连接
  4.             HiSqlClient sqlClient = Demo_Init.GetSqlClient();
  5.             //hisql需要初始货安装 只需要执行一次
  6.             sqlClient.CodeFirst.InstallHisql();
  7.             //freesql连接
  8.             IFreeSql freeClient = Demo_Init.GetFreeSqlClient();
  9.             //sqlsugar连接
  10.             SqlSugarClient sugarClient = Demo_Init.GetSugarClient();
  11.             sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C01));
  12.             Console.WriteLine("初始化hisql专用表成功!");
  13.             sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C02));
  14.             Console.WriteLine("初始化sqlsugar专用表成功!");
  15.             sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C03));
  16.             Console.WriteLine("初始化freesql专用表成功!");
  17.             Console.WriteLine($"测试场景 Sqlserver  向表中插入{_count}条数据 50列 常规数据插入)");
  18.             Console.WriteLine($"适用于大量数据导入场景");
  19.             List<object> lstobj = new List<object>();
  20.             List<Table.H_Test50C02> lstobj2 = new List<Table.H_Test50C02>();
  21.             List<Table.H_Test50C03> lstobj3 = new List<Table.H_Test50C03>();
  22.             Random random = new Random();
  23.             //插入的参数值都随机产生 以免数据库执行相同SQL时会有缓存影响测试结果
  24.             for (int i = 0; i < _count; i++)
  25.             {
  26.                 //hisql可以用实体类也可以用匿名类
  27.                 lstobj.Add(new Table.H_Test50C01 {
  28.                     Material=(900000+i).ToString(),
  29.                     Batch=(30000000+i).ToString(),
  30.                     TestNum1= random.Next(10,100),
  31.                     TestNum2 = random.Next(10, 100),
  32.                     TestNum3 = random.Next(10, 100),
  33.                     TestNum4 = random.Next(10, 100),
  34.                     TestNum5 = random.Next(10, 100),
  35.                     TestNum6 = random.Next(10, 100),
  36.                     TestNum7 = random.Next(10, 100),
  37.                     TestNum8 = random.Next(10, 100),
  38.                     TestNum9 = random.Next(10, 100),
  39.                     TestNum10 = random.Next(10, 100),
  40.                     TestNum11 = random.Next(10, 100),
  41.                     TestNum12 = random.Next(10, 100),
  42.                     TestNum13= random.Next(10, 100),
  43.                     TestNum14= random.Next(10, 100),
  44.                     TestNum15= random.Next(10, 100),
  45.                     TestStr1 = $"hisql{random.Next(1, 100).ToString()}",
  46.                     TestStr2 = $"hisql{random.Next(1, 100).ToString()}",
  47.                     TestStr3 = $"hisql{random.Next(1, 100).ToString()}",
  48.                     TestStr4 = $"hisql{random.Next(1, 100).ToString()}",
  49.                     TestStr5 = $"hisql{random.Next(1, 100).ToString()}",
  50.                     TestStr6 = $"hisql{random.Next(1, 100).ToString()}",
  51.                     TestStr7 = $"hisql{random.Next(1, 100).ToString()}",
  52.                     TestStr8 = $"hisql{random.Next(1, 100).ToString()}",
  53.                     TestStr9 = $"hisql{random.Next(1, 100).ToString()}",
  54.                     TestStr10 = $"hisql{random.Next(1, 100).ToString()}",
  55.                     TestStr11 = $"hisql{random.Next(1, 100).ToString()}",
  56.                     TestStr12 = $"hisql{random.Next(1, 100).ToString()}",
  57.                     TestStr13 = $"hisql{random.Next(1, 100).ToString()}",
  58.                     TestStr14 = $"hisql{random.Next(1, 100).ToString()}",
  59.                     TestStr15 = $"hisql{random.Next(1, 100).ToString()}",
  60.                     TestDec1 = i+ random.Next(1, 10000)/3,
  61.                     TestDec2 = i + random.Next(1, 10000) / 3,
  62.                     TestDec3 = i + random.Next(1, 10000) / 3,
  63.                     TestDec4 = i + random.Next(1, 10000) / 3,
  64.                     TestDec5 = i + random.Next(1, 10000) / 3,
  65.                     TestDec6 = i + random.Next(1, 10000) / 3,
  66.                     TestDec7 = i + random.Next(1, 10000) / 3,
  67.                     TestDec8 = i + random.Next(1, 10000) / 3,
  68.                     TestDec9 = i + random.Next(1, 10000) / 3,
  69.                     TestDec10 = i + random.Next(1, 10000) / 3,
  70.                     TestDec11 = i + random.Next(1, 10000) / 3,
  71.                     TestDec12 = i + random.Next(1, 10000) / 3,
  72.                     TestDec13 = i + random.Next(1, 10000) / 3,
  73.                     TestDec14 = i + random.Next(1, 10000) / 3,
  74.                     TestDec15 = i + random.Next(1, 10000) / 3,
  75.                     Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"hisql初始创建" });
  76.                 //sqlsugar用匿句类报错用实体类
  77.                 lstobj2.Add(new Table.H_Test50C02
  78.                 {
  79.                     Material = (900000 + i).ToString(),
  80.                     Batch = (30000000 + i).ToString(),
  81.                     TestNum1 = random.Next(10, 100),
  82.                     TestNum2 = random.Next(10, 100),
  83.                     TestNum3 = random.Next(10, 100),
  84.                     TestNum4 = random.Next(10, 100),
  85.                     TestNum5 = random.Next(10, 100),
  86.                     TestNum6 = random.Next(10, 100),
  87.                     TestNum7 = random.Next(10, 100),
  88.                     TestNum8 = random.Next(10, 100),
  89.                     TestNum9 = random.Next(10, 100),
  90.                     TestNum10 = random.Next(10, 100),
  91.                     TestNum11 = random.Next(10, 100),
  92.                     TestNum12 = random.Next(10, 100),
  93.                     TestNum13 = random.Next(10, 100),
  94.                     TestNum14 = random.Next(10, 100),
  95.                     TestNum15 = random.Next(10, 100),
  96.                     TestStr1 = $"sqlsugar{random.Next(1, 100).ToString()}",
  97.                     TestStr2 = $"sqlsugar{random.Next(1, 100).ToString()}",
  98.                     TestStr3 = $"sqlsugar{random.Next(1, 100).ToString()}",
  99.                     TestStr4 = $"sqlsugar{random.Next(1, 100).ToString()}",
  100.                     TestStr5 = $"sqlsugar{random.Next(1, 100).ToString()}",
  101.                     TestStr6 = $"sqlsugar{random.Next(1, 100).ToString()}",
  102.                     TestStr7 = $"sqlsugar{random.Next(1, 100).ToString()}",
  103.                     TestStr8 = $"sqlsugar{random.Next(1, 100).ToString()}",
  104.                     TestStr9 = $"sqlsugar{random.Next(1, 100).ToString()}",
  105.                     TestStr10 = $"sqlsugar{random.Next(1, 100).ToString()}",
  106.                     TestStr11 = $"sqlsugar{random.Next(1, 100).ToString()}",
  107.                     TestStr12 = $"sqlsugar{random.Next(1, 100).ToString()}",
  108.                     TestStr13 = $"sqlsugar{random.Next(1, 100).ToString()}",
  109.                     TestStr14 = $"sqlsugar{random.Next(1, 100).ToString()}",
  110.                     TestStr15 = $"sqlsugar{random.Next(1, 100).ToString()}",
  111.                     TestDec1 = i + random.Next(1, 10000) / 3,
  112.                     TestDec2 = i + random.Next(1, 10000) / 3,
  113.                     TestDec3 = i + random.Next(1, 10000) / 3,
  114.                     TestDec4 = i + random.Next(1, 10000) / 3,
  115.                     TestDec5 = i + random.Next(1, 10000) / 3,
  116.                     TestDec6 = i + random.Next(1, 10000) / 3,
  117.                     TestDec7 = i + random.Next(1, 10000) / 3,
  118.                     TestDec8 = i + random.Next(1, 10000) / 3,
  119.                     TestDec9 = i + random.Next(1, 10000) / 3,
  120.                     TestDec10 = i + random.Next(1, 10000) / 3,
  121.                     TestDec11 = i + random.Next(1, 10000) / 3,
  122.                     TestDec12 = i + random.Next(1, 10000) / 3,
  123.                     TestDec13 = i + random.Next(1, 10000) / 3,
  124.                     TestDec14 = i + random.Next(1, 10000) / 3,
  125.                     TestDec15 = i + random.Next(1, 10000) / 3,
  126.                     Salary = 5000 + (i % 2000) + random.Next(10),
  127.                     Descript = $"sqlsugar初始创建"
  128.                 });
  129.                 lstobj3.Add(new Table.H_Test50C03
  130.                 {
  131.                     Material = (900000 + i).ToString(),
  132.                     Batch = (30000000 + i).ToString(),
  133.                     TestNum1 = random.Next(10, 100),
  134.                     TestNum2 = random.Next(10, 100),
  135.                     TestNum3 = random.Next(10, 100),
  136.                     TestNum4 = random.Next(10, 100),
  137.                     TestNum5 = random.Next(10, 100),
  138.                     TestNum6 = random.Next(10, 100),
  139.                     TestNum7 = random.Next(10, 100),
  140.                     TestNum8 = random.Next(10, 100),
  141.                     TestNum9 = random.Next(10, 100),
  142.                     TestNum10 = random.Next(10, 100),
  143.                     TestNum11 = random.Next(10, 100),
  144.                     TestNum12 = random.Next(10, 100),
  145.                     TestNum13 = random.Next(10, 100),
  146.                     TestNum14 = random.Next(10, 100),
  147.                     TestNum15 = random.Next(10, 100),
  148.                     TestStr1 = $"freesql{random.Next(1, 100).ToString()}",
  149.                     TestStr2 = $"freesql{random.Next(1, 100).ToString()}",
  150.                     TestStr3 = $"freesql{random.Next(1, 100).ToString()}",
  151.                     TestStr4 = $"freesql{random.Next(1, 100).ToString()}",
  152.                     TestStr5 = $"freesql{random.Next(1, 100).ToString()}",
  153.                     TestStr6 = $"freesql{random.Next(1, 100).ToString()}",
  154.                     TestStr7 = $"freesql{random.Next(1, 100).ToString()}",
  155.                     TestStr8 = $"freesql{random.Next(1, 100).ToString()}",
  156.                     TestStr9 = $"freesql{random.Next(1, 100).ToString()}",
  157.                     TestStr10 = $"freesql{random.Next(1, 100).ToString()}",
  158.                     TestStr11 = $"freesql{random.Next(1, 100).ToString()}",
  159.                     TestStr12 = $"freesql{random.Next(1, 100).ToString()}",
  160.                     TestStr13 = $"freesql{random.Next(1, 100).ToString()}",
  161.                     TestStr14 = $"freesql{random.Next(1, 100).ToString()}",
  162.                     TestStr15 = $"freesql{random.Next(1, 100).ToString()}",
  163.                     TestDec1 = i + random.Next(1, 10000) / 3,
  164.                     TestDec2 = i + random.Next(1, 10000) / 3,
  165.                     TestDec3 = i + random.Next(1, 10000) / 3,
  166.                     TestDec4 = i + random.Next(1, 10000) / 3,
  167.                     TestDec5 = i + random.Next(1, 10000) / 3,
  168.                     TestDec6 = i + random.Next(1, 10000) / 3,
  169.                     TestDec7 = i + random.Next(1, 10000) / 3,
  170.                     TestDec8 = i + random.Next(1, 10000) / 3,
  171.                     TestDec9 = i + random.Next(1, 10000) / 3,
  172.                     TestDec10 = i + random.Next(1, 10000) / 3,
  173.                     TestDec11 = i + random.Next(1, 10000) / 3,
  174.                     TestDec12 = i + random.Next(1, 10000) / 3,
  175.                     TestDec13 = i + random.Next(1, 10000) / 3,
  176.                     TestDec14 = i + random.Next(1, 10000) / 3,
  177.                     TestDec15 = i + random.Next(1, 10000) / 3,
  178.                     Salary = 5000 + (i % 2000) + random.Next(10),
  179.                     Descript = $"freesql初始创建"
  180.                 });
  181.             }
  182.             //删除测试表中的数据
  183.             sqlClient.TrunCate("H_Test50C01").ExecCommand();
  184.             sqlClient.TrunCate("H_Test50C02").ExecCommand();
  185.             sqlClient.TrunCate("H_Test50C03").ExecCommand();
  186.             Stopwatch sw = new Stopwatch();
  187.             #region freesql
  188.             sw.Reset();
  189.             Console.WriteLine("------------------------------");
  190.             Console.WriteLine("----------FreeSql 测试----------");
  191.             Console.WriteLine($"FreeSql 预热...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  192.             var temp3 = freeClient.Queryable<Table.H_Test50C03>().Where(w => w.TestDec1 < 0).ToList();
  193.             Console.WriteLine($"FreeSql  正在插入数据\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  194.             sw.Start();
  195.             freeClient.Insert<Table.H_Test50C03>(lstobj3).ExecuteAffrows();
  196.             sw.Stop();
  197.             Console.WriteLine($"FreeSql 数据插入{_count}条 耗时{sw.Elapsed}秒");
  198.             sw.Reset();
  199.             #endregion
  200.             #region hisql
  201.             sw.Reset();
  202.             Console.WriteLine("------------------------------");
  203.             Console.WriteLine("----------HiSql 测试----------");
  204.             Console.WriteLine($"HiSql 预热...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  205.             var temp1 = sqlClient.Query("H_Test50C01").Field("*").Take(1).Skip(1).ToDynamic();
  206.             Console.WriteLine($"HiSql  正在插入数据\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  207.             sw.Start();
  208.             sqlClient.Insert("H_Test50C01", lstobj).ExecCommand();
  209.             sw.Stop();
  210.             Console.WriteLine($"hisql 数据插入{_count}条 耗时{sw.Elapsed}秒");
  211.             sw.Reset();
  212.             #endregion
  213.             #region sqlsugar
  214.             sw.Reset();
  215.             Console.WriteLine("------------------------------");
  216.             Console.WriteLine("----------SqlSugar 测试----------");
  217.             Console.WriteLine($"SqlSugar 预热...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  218.             var temp2 = sugarClient.Queryable<Table.H_Test50C03>("H_Test50C03").Where(w => w.TestDec1 < 1).ToList();
  219.             Console.WriteLine($"sqlsugar  正在插入数据\t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
  220.             sw.Start();
  221.             sugarClient.Insertable(lstobj2).AS("H_Test50C03").ExecuteCommand();
  222.             sw.Stop();
  223.             Console.WriteLine($"sqlsugar 数据插入{_count}条 耗时{sw.Elapsed}秒");
  224.             sw.Reset();
  225.             #endregion
  226.         }
复制代码
测试结果

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插入谁快认慢一目了然,不过我还是想贴上以下图


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表