diff --git a/性能.md b/性能.md index d7a07cb..217ef1c 100644 --- a/性能.md +++ b/性能.md @@ -1,6 +1,60 @@ FreeSql实现了强大功能的同时,性能没有受到影响,项目中使用反射或耗时的操作都经过了缓存处理。读取数据部分采用了ExpressionTree,使得FreeSql解析实体数据的速度与Dapper非常接近。 -## 测试代码 +# 插入测试 + +### 测试结果(52个字段) + +| | 18W+52C | 1W+52C | 5K+52C | 2K+52C | 1K+52C | 500+52C | 100+52C | 50+52C | +| -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | +| MySql 5.5 ExecuteAffrows | 55,497ms | 4,953ms | 2,304ms | 2,554ms | 1,516ms | 1,572ms | 265ms | 184ms | +| SqlServer Express ExecuteAffrows | 402,355ms | 24,847ms | 11,465ms | 4,971ms | 2,437ms | 915ms | 138ms | 88ms | +| SqlServer Express ExecuteSqlBulkCopy | 21,065ms | 578ms | 326ms | 139ms | 105ms | 79ms | 60ms | 48ms | +| PostgreSQL 10 ExecuteAffrows | 46,756ms | 3,294ms | 2,269ms | 1,019ms | 374ms | 209ms | 51ms | 37ms | +| PostgreSQL 10 ExecutePgCopy | 10,090ms | 583ms | 337ms | 136ms | 88ms | 61ms | 30ms | 25ms | +| Oracle XE ExecuteAffrows | - | - | - | - | 24,528 | 10,648ms | 571ms | 200ms | +| Sqlite ExecuteAffrows | 28,554ms | 1,149ms | 701ms | 327ms | 155ms | 91ms | 44ms | 35ms | + +> 18W+52C 解释:插入18万行记录,表字段有52个 + +> Oracle 插入性能不用怀疑,可能安装学生版限制较大 + +提醒:开源数据库测试结果比较有意义,商业数据库版本之间性能可能有较大差距 + +### 测试结果(10个字段) + +| | 18W+10C | 1W+10C | 5K+10C | 2K+10C | 1K+10C | 500+10C | 100+10C | 50+10C | +| -- | -- | -- | -- | -- | -- | -- | -- | -- | +| MySql 5.5 ExecuteAffrows | 15,380ms | 1,813ms | 1,457ms | 1,254ms | 563ms | 246ms | 55ms | 21ms | +| SqlServer Express ExecuteAffrows | 47,204ms | 2,275ms | 1,108ms | 488ms | 279ms | 123ms | 35ms | 16ms | +| SqlServer Express ExecuteSqlBulkCopy | 4,248ms | 127ms | 71ms | 30ms | 48ms | 14ms | 11ms | 10ms | +| PostgreSQL 10 ExecuteAffrows | 9,786ms | 568ms | 336ms | 157ms | 102ms | 34ms | 9ms | 6ms | +| PostgreSQL 10 ExecutePgCopy | 4,081ms | 167ms | 93ms | 39ms | 21ms | 12ms | 4ms | 2ms | +| Oracle XE ExecuteAffrows | - | - | - | - | 2,394 | 731ms | 67ms | 33ms | +| Sqlite ExecuteAffrows | 4,524ms | 246ms | 137ms | 94ms | 35ms | 19ms | 14ms | 11ms | + +> 测试结果,是在相同操作系统下进行的,并且都有预热 + +```csharp +public class TestInsert10c +{ + [Column(MapType = typeof(string))] + public Guid Id { get; set; } + + public string UserName0 { get; set; } + public string PassWord0 { get; set; } + public DateTime CreateTime0 { get; set; } + + public string UserName1 { get; set; } + public string PassWord1 { get; set; } + public DateTime CreateTime1 { get; set; } + + public string UserName2 { get; set; } + public string PassWord2 { get; set; } + public DateTime CreateTime2 { get; set; } +} +``` + +# 查询测试 ```csharp IFreeSql mysql = new FreeSql.FreeSqlBuilder() @@ -21,7 +75,7 @@ class Song { 测试方法:运行两次,以第二次性能报告,避免了首个运行慢不公平的情况。 -## 测试结果 +### 测试结果 | | 数量 | Query\ | Query\ | Query\ | | - | - | - | - | - | diff --git a/更新日志.md b/更新日志.md index 7d1006d..314e0db 100644 --- a/更新日志.md +++ b/更新日志.md @@ -16,6 +16,7 @@ - 增加 IInsert/IUpdate BatchOptions 方法指定批量插入的设置; - 增加 IInsert.ToDataTable 方法,为 BulkCopy 操作提供数据,该方法处理了(表名、字段名、类型)映射和忽略列; - 增加 IInsert.ExecuteSqlBulkCopy 扩展方法执行 SqlBulkCopy 批量插入,在 FreeSql.Provider.SqlServer 可用; +- 增加 IInsert.ExecutePgCopy 扩展方法执行 PostgreSQL Copy 批量导入,在 FreeSql.Provider.PostgreSQL 可用; ## v0.12.21