stay 2022 year 1 I did it once in July sqlsugar,hisql,freesql Performance test of three frameworks , Last time it was mainly measured sqlserver General insert under ( Not bulkcopy Data insertion ),hisql Compared with the more popular ORM Framework performance test comparison Half a year has passed , This time I will test a more complete test scheme as follows

Test plan

  1. Test four databases (sqlserver,mysql,oralce,postgresql) Write a test article for each database
  2. Regular insert and batch insert
  3. Data volume from 5 Strip to 100W Data insertion between
  4. Data column from 5 Column sum 50 Various data type scenarios for Columns
  5. Open source test code for you to check whether the test is fair and impartial

Test source https://github.com/tansar/HiSqlTestDemo

Test environment

Operating system environment

sqlserver Environmental Science

mysql Environmental Science

oracle Environmental Science

postgresql Environmental Science

sqlserver Routine data insertion test

10 The test code for the following fields is as follows

  public static void TestSqlServerInsert(int _count)
{ //hisql Connect Please configure the database connection first
HiSqlClient sqlClient = Demo_Init.GetSqlClient();
//hisql Initial cargo installation is required It only needs to be executed once
sqlClient.CodeFirst.InstallHisql(); //freesql Connect
IFreeSql freeClient = Demo_Init.GetFreeSqlClient(); //sqlsugar Connect
SqlSugarClient sugarClient = Demo_Init.GetSugarClient(); sqlClient.CodeFirst.CreateTable(typeof(Table.HTest01)); Console.WriteLine(" initialization hisql Private table succeeded !"); sqlClient.CodeFirst.CreateTable(typeof(Table.HTest02)); Console.WriteLine(" initialization sqlsugar Private table succeeded !"); sqlClient.CodeFirst.CreateTable(typeof(Table.HTest03));
Console.WriteLine(" initialization freesql Private table succeeded !"); Console.WriteLine($" Test scenarios Sqlserver Insert... Into the table {_count} Data General data insertion )");
Console.WriteLine($" Insert routine data that is most suitable for daily application scenarios "); 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(); // The inserted parameter values are generated randomly To prevent the database from executing the same SQL There will be a cache that will affect the test results
for (int i = 0; i < _count; i++)
{
//hisql You can use entity classes or anonymous classes
lstobj.Add(new Table.HTest01 { SID = (i + 1), UName = $"hisql{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"hisql Initial creation " }); //sqlsugar Report misuse of entity class with hidden sentence class
lstobj2.Add(new Table.HTest02 { SID = (i + 1), UName = $"sqlsugar{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"sqlsugar Initial creation " });
lstobj3.Add(new Table.HTest03 { SID = (i + 1), UName = $"freesql{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"freesql Initial creation " });
} // Delete the data in the test table
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 test ----------");
Console.WriteLine($"FreeSql preheating ...{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 Inserting data \t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
sw.Start();
freeClient.Insert<Table.HTest03>(lstobj3).ExecuteAffrows(); sw.Stop();
Console.WriteLine($"FreeSql Insert data into {_count} strip Time consuming {sw.Elapsed} second ");
sw.Reset();
#endregion #region hisql
sw.Reset();
Console.WriteLine("------------------------------");
Console.WriteLine("----------HiSql test ----------");
Console.WriteLine($"HiSql preheating ...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
var temp1 = sqlClient.Query("HTest01").Field("*").Take(1).Skip(1).ToDynamic();
Console.WriteLine($"HiSql Inserting data \t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
sw.Start();
sqlClient.Insert("HTest01", lstobj).ExecCommand();
sw.Stop();
Console.WriteLine($"hisql Insert data into {_count} strip Time consuming {sw.Elapsed} second ");
sw.Reset();
#endregion

50 The column field test code is as follows

  public static void TestSqlServer50ColInsert(int _count)
{ //hisql Connect Please configure the database connection first
HiSqlClient sqlClient = Demo_Init.GetSqlClient();
//hisql Initial cargo installation is required It only needs to be executed once
sqlClient.CodeFirst.InstallHisql(); //freesql Connect
IFreeSql freeClient = Demo_Init.GetFreeSqlClient(); //sqlsugar Connect
SqlSugarClient sugarClient = Demo_Init.GetSugarClient(); sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C01)); Console.WriteLine(" initialization hisql Private table succeeded !"); sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C02)); Console.WriteLine(" initialization sqlsugar Private table succeeded !"); sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C03));
Console.WriteLine(" initialization freesql Private table succeeded !"); Console.WriteLine($" Test scenarios Sqlserver Insert... Into the table {_count} Data 50 Column General data insertion )");
Console.WriteLine($" Insert routine data that is most suitable for daily application scenarios "); 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(); // The inserted parameter values are generated randomly To prevent the database from executing the same SQL There will be a cache that will affect the test results
for (int i = 0; i < _count; i++)
{
//hisql You can use entity classes or anonymous classes
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 Initial creation " }); //sqlsugar Report misuse of entity class with hidden sentence class
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 Initial creation "
});
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 Initial creation "
});
} // Delete the data in the test table
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 test ----------");
Console.WriteLine($"FreeSql preheating ...{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 Inserting data \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 Insert data into {_count} strip Time consuming {sw.Elapsed} second ");
sw.Reset();
#endregion #region hisql
sw.Reset();
Console.WriteLine("------------------------------");
Console.WriteLine("----------HiSql test ----------");
Console.WriteLine($"HiSql preheating ...{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 Inserting data \t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
sw.Start();
sqlClient.Insert("H_Test50C01", lstobj).ExecCommand();
sw.Stop();
Console.WriteLine($"hisql Insert data into {_count} strip Time consuming {sw.Elapsed} second ");
sw.Reset();
#endregion #region sqlsugar
sw.Reset();
Console.WriteLine("------------------------------");
Console.WriteLine("----------SqlSugar test ----------");
Console.WriteLine($"SqlSugar preheating ...{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 Inserting data \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 Insert data into {_count} strip Time consuming {sw.Elapsed} second ");
sw.Reset();
#endregion
}

test result

5 Bar record 10 The following test result screenshots are listed

5 Bar record 50 Screenshot of column test results

50 Bar record 10 The following test result screenshots are listed

50 Bar record 50 Screenshot of column test results

100 Bar record 10 The following test result screenshots are listed

100 Bar record 50 Screenshot of column test results

500 Bar record 10 The following test result screenshots are listed

500 Bar record 50 Screenshot of column test results

1000 Bar record 10 The following test result screenshots are listed

1000 Bar record 50 Screenshot of column test results

5000 Bar record 10 The following test result screenshots are listed

5000 Bar record 50 Screenshot of column test results

10000 Bar record 10 The following test result screenshots are listed

10000 Bar record 50 Screenshot of the results of the series test

50000 Bar record 10 The following test result screenshots are listed

50000 Bar record 50 Screenshot of column test results

100000 Bar record 10 The following test result screenshots are listed

100000 Bar record 50 Screenshot of column test results

sqlsugar An exception is thrown while performing this operation

Error message :System.Data.SqlClient.SqlException:“ Resource pool “default” There is not enough system memory to run this query

In separate execution only sqlsugar The test sample of still reports this error Through analysis sqlsugar The underlying implementation logic is that it assembles all the insertions into one sql Caused by documents

test result

sqlserver Batch (bulkcopy) Insert test data

Many people may think that if a large number of data is inserted, it will not be inserted in the conventional way. Instead, it should be BulkCopy The way to insert , good , Then let's test the database provided by the database manufacturer SDK The drive comes with BulkCopy Let's compare the performance of the three frameworks

10 List the following batch inserted bulkcopy Test code

public static void TestSqlServerBulkCopy(int _count)
{ //hisql Connect Please configure the database connection first
HiSqlClient sqlClient = Demo_Init.GetSqlClient();
//hisql Initial cargo installation is required It only needs to be executed once
sqlClient.CodeFirst.InstallHisql(); //freesql Connect
IFreeSql freeClient = Demo_Init.GetFreeSqlClient(); //sqlsugar Connect
SqlSugarClient sugarClient = Demo_Init.GetSugarClient(); sqlClient.CodeFirst.CreateTable(typeof(Table.HTest01)); Console.WriteLine(" initialization hisql Private table succeeded !"); sqlClient.CodeFirst.CreateTable(typeof(Table.HTest02)); Console.WriteLine(" initialization sqlsugar Private table succeeded !"); sqlClient.CodeFirst.CreateTable(typeof(Table.HTest03));
Console.WriteLine(" initialization freesql Private table succeeded !"); Console.WriteLine($" Test scenarios Sqlserver Insert... Into the table {_count} Data BulkCopy Way to insert ");
Console.WriteLine($" It is applicable to a large number of data import scenarios "); 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(); // The inserted parameter values are generated randomly To prevent the database from executing the same SQL There will be a cache that will affect the test results
for (int i = 0; i < _count; i++)
{
//hisql You can use entity classes or anonymous classes
lstobj.Add(new Table.HTest01 { SID = (i + 1), UName = $"hisql{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"hisql Initial creation " }); //sqlsugar Report misuse of entity class with hidden sentence class
lstobj2.Add(new Table.HTest02 { SID = (i + 1), UName = $"sqlsugar{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"sqlsugar Initial creation " });
lstobj3.Add(new Table.HTest03 { SID = (i + 1), UName = $"freesql{i}", Age = 20 + (i % 50), Salary = 5000 + (i % 2000) + random.Next(10), Descript = $"freesql Initial creation " });
} // Delete the data in the test table
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 test ----------");
Console.WriteLine($"FreeSql preheating ...{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 Inserting data \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 Insert data into {_count} strip Time consuming {sw.Elapsed} second ");
sw.Reset();
#endregion #region hisql
sw.Reset();
Console.WriteLine("------------------------------");
Console.WriteLine("----------HiSql test ----------");
Console.WriteLine($"HiSql preheating ...{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
var temp1 = sqlClient.Query("HTest01").Field("*").Take(1).Skip(1).ToDynamic();
Console.WriteLine($"HiSql Inserting data \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 Insert data into {_count} strip Time consuming {sw.Elapsed} second ");
sw.Reset();
#endregion #region sqlsugar
sw.Reset();
Console.WriteLine("------------------------------");
Console.WriteLine("----------SqlSugar test ----------");
Console.WriteLine($"SqlSugar preheating ...{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 Inserting data \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 Insert data into {_count} strip Time consuming {sw.Elapsed} second ");
sw.Reset();
#endregion
}

50 Column batch inserted bulkcopy Test code

public static void TestSqlServer50ColInsert(int _count)
{ //hisql Connect Please configure the database connection first
HiSqlClient sqlClient = Demo_Init.GetSqlClient();
//hisql Initial cargo installation is required It only needs to be executed once
sqlClient.CodeFirst.InstallHisql(); //freesql Connect
IFreeSql freeClient = Demo_Init.GetFreeSqlClient(); //sqlsugar Connect
SqlSugarClient sugarClient = Demo_Init.GetSugarClient(); sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C01)); Console.WriteLine(" initialization hisql Private table succeeded !"); sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C02)); Console.WriteLine(" initialization sqlsugar Private table succeeded !"); sqlClient.CodeFirst.CreateTable(typeof(Table.H_Test50C03));
Console.WriteLine(" initialization freesql Private table succeeded !"); Console.WriteLine($" Test scenarios Sqlserver Insert... Into the table {_count} Data 50 Column General data insertion )");
Console.WriteLine($" It is applicable to a large number of data import scenarios "); 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(); // The inserted parameter values are generated randomly To prevent the database from executing the same SQL There will be a cache that will affect the test results
for (int i = 0; i < _count; i++)
{
//hisql You can use entity classes or anonymous classes
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 Initial creation " }); //sqlsugar Report misuse of entity class with hidden sentence class
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 Initial creation "
});
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 Initial creation "
});
} // Delete the data in the test table
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 test ----------");
Console.WriteLine($"FreeSql preheating ...{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 Inserting data \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 Insert data into {_count} strip Time consuming {sw.Elapsed} second ");
sw.Reset();
#endregion #region hisql
sw.Reset();
Console.WriteLine("------------------------------");
Console.WriteLine("----------HiSql test ----------");
Console.WriteLine($"HiSql preheating ...{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 Inserting data \t{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
sw.Start();
sqlClient.Insert("H_Test50C01", lstobj).ExecCommand();
sw.Stop();
Console.WriteLine($"hisql Insert data into {_count} strip Time consuming {sw.Elapsed} second ");
sw.Reset();
#endregion #region sqlsugar
sw.Reset();
Console.WriteLine("------------------------------");
Console.WriteLine("----------SqlSugar test ----------");
Console.WriteLine($"SqlSugar preheating ...{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 Inserting data \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 Insert data into {_count} strip Time consuming {sw.Elapsed} second ");
sw.Reset();
#endregion
}

test result

1W Data 10 Column the following fields bulkcopy Insert the test

1W Data 50 Column fields bulkcopy Insert the test

5W Data 10 Column the following fields bulkcpy Insert the test

5W Data 50 Column fields bulkcopy Insert the test

10W Data 10 Column the following fields Bulkcopy Insert the test

10W Data 50 Column fields bulkcopy Insert the test

20w Data 10 Column the following fields bulkcopy Insert the test

20w Data 50 Column fields bulkcopy Insert the test

50w Data 10 Column fields Bulkcopy Insert the test

50w Data 50 Column fields BulkCopy Insert the test

100W strip 10 Column the following fields bulkCopy Insert the test

100W Data 50 Column fields bulkcopy Insert the test

test result

summary

I don't think it's necessary to summarize Three ORM Whether it's normal insertion or bulkcopy It's easy to see who's fast or slow to insert , But I still want to post the following picture

c# sqlsugar,hisql,freesql orm Comparison of all-round performance test of the frame sqlserver More articles on performance testing

  1. .NET ORM frame SqlSuagr4.0 Function explanation and practice 【 Open source 】

    SqlSugar 4.0 ORM Advantages of frameworks In order to better support multi base distributed storage in the future , Parallel computing and other functions , take SqlSugar3.x Rewrite all , The existing architecture can easily expand multiple libraries . Source download : https://gith ...

  2. .NET ORM frame SqlSugar4.0 Quick preview of features 【 Open source 】

    SqlSugar 4.0 ORM Advantages of frameworks In order to better support multi base distributed storage in the future , Parallel computing and other functions , take SqlSugar3.x Rewrite all , The existing architecture can easily expand multiple libraries . Source download : https://gith ...

  3. sqlsugar freesql hisql Three ORM Framework performance test comparison

    hisql Compared with the more popular ORM Framework performance test comparison Overall test results Number of records inserted hisql( Time consuming ) sqlsugar( Time consuming ) freesql( Time consuming ) 5 strip 0.0107 second 0.0312 second 0.02675 second ...

  4. hisql ORM Framework Research ( The first domestic support HANA Of ORM frame )

    HiSql Operation instruction document V1.0 The next generation ORM frame The first domestic support HANA Of ORM frame hisql Source download git clone https://github.com/tansar/HiSql.git ...

  5. hisql orm frame insert Data writing tutorial

    hisql.net Official website ( Document writing ) HiSql Source code (github) https://github.com/tansar/HiSql git clone https://github.com/ta ...

  6. .Net Open source SqlServer ORM frame SqlSugar Arrangement

    One . Link collation official Git Source code address : https://github.com/sunkaixuan/SqlSugar Update address for the latest release : current version Release 3.5.2.1 https://gith ...

  7. .NET(C#) What are the mainstream ORM frame ,SqlSugar,Dapper,EF still ...

    Preface In a previous article , For you to share < What is? ORM? Why ORM? elementary analysis ORM The use and advantages and disadvantages of traditional Chinese Medicine >. that , At present .NET(C#) In the world of , What are the mainstream ORM,SqlSugar,Dapper, ...

  8. remember SqlSugar ORM No primary key found in frame

    The front end time is .NetCore Project use SqlSugar ORM frame ( quote sqlSugarCore Dependency package ) I met a wonderful problem when I was young : When updating the table data , Report errors “ You cannot have n ...

  9. About orm Personal tests for ——SqlSugar And FreeSql

    Preface In a twinkling of an eye, the golden nine has passed , Time is really like an arrow , Working overtime on Saturday , I just want to do something in my spare time , Just recently, I was wondering if it was necessary to change orm, From original to Dapper, And now Sqlsugar, Because I often hear some good orm, ...

  10. .Net Commonly used ORM Frame comparison :EF Core、FreeSql、SqlSuger

    Preface : Recently due to work needs , You need to choose one ORM frame , And that's right EF Core.FreeSql.SqlSuger For a simple comparison . I think each has its own advantages , Existence is reason , Otherwise it would have been eliminated , So how to choose people . Due to the project ...

Random recommendation

  1. HTML &lt;meta&gt; label , Search engine

    About Mate A detailed explanation of the label , Please check out w3school The website is :http://www.w3school.com.cn/tags/tag_meta.asp meta Function of label META The label is HTML Mark HEA ...

  2. BZOJ 1083 Answer key

    1083: [SCOI2005] A busy city Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2431  Solved: 1596[Submit][Sta ...

  3. ARM Upper linux How to realize the hot plug and cold plug of wireless network card

    ARM Upper linux How to realize the hot plug and cold plug of wireless network card fulinux  Lingyun lab 1.  Cold swap If before the system is powered on RT2070/RT3070 Chip wireless network card ( hereinafter referred to as wlan) Plug in , That is, cold swap . We know ...

  4. How to be in CentOS Top mount 2048 Little games

    How to be in centos Top mount 2048 Little games Studying recently CentOS System , Just figure out what to play with , Then I saw someone playing 2048 Little games , All I'm thinking about is , Why not install one 2048 Let's play a little game , So , I started working from ...

  5. raid5 What to do when two hard disks are offline ? How to recover data when the forced online fails

    Server fault description : Customer use Dell 2850 The server is set up raid5 disk array , The array contains 6 Block hard disk (SCSI Hard disk , Single disk capacity 300G), The server operating system is linux Redhat4: The file system is ext3 The document department ...

  6. sass Basics — Specific compilation steps and corresponding commands : detailed

    /* Basic grammar */h1{ color: red;} /* Variable definitions */ $color: red; /* nesting */body{ header{ } footer{ }} /*mixin function */@mixin al ...

  7. python Delete folder

    Only empty folders can be deleted , Deleting a non empty folder will report an error >>> import os >>> os.rmdir("/tmp/ssh-GyoPWOFZ47") Tr ...

  8. CSS—— What you don't know CSS ::before and ::after Pseudo element usage ( turn )

    What you don't know CSS ::before and ::after Pseudo element usage CSS There are two pseudo classes that are not commonly used :before and :after, Occasionally, it is used by people to add some custom formats or something , But they do more than that . front ...

  9. DNS Introduction to server ——2

    Generate HTTP After the message , Because we entered the domain name of the server , But what is needed in the sending of the package is that of the server IP Address , So the next job is to find the server IP Address , And inquiry IP Address , Need DNS The server came to help . IP Address profile : IP ...

  10. bzoj 2144: Checkers —— Multiply / Two points

    Description Checkers are played on a number axis . Chessmen can only be placed on the whole point . No more than one chess piece can be placed at each point . We use checkers to make a simple game : There are... On the chessboard 3 Chess pieces , Respectively in a,b,c These three positions . We're going to get him with the least bounce ...