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
- Test four databases (sqlserver,mysql,oralce,postgresql) Write a test article for each database
- Regular insert and batch insert
- Data volume from 5 Strip to 100W Data insertion between
- Data column from 5 Column sum 50 Various data type scenarios for Columns
- 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
- .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 ...
- .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 ...
- 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 ...
- 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 ...
- 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 ...
- .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 ...
- .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, ...
- 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 ...
- 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, ...
- .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
- HTML <meta> 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 ...
- BZOJ 1083 Answer key
1083: [SCOI2005] A busy city Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2431 Solved: 1596[Submit][Sta ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...








