公司网站建设维护合同,上海建设监理协会网站,wordpress 小清新,网站建设手机官网一. 综述 该模块主要介绍#xff1a;EF的性能优化插件Z.EntityFramework.Extensions#xff0c;该插件收费。
(一). 简介
1. 相关网站#xff1a;http://www.zzzprojects.com/
2. 下载途径#xff1a;通过Nuget直接下载或者去官网下载(要注意更新最新版本#xff0c;可…一. 综述 该模块主要介绍EF的性能优化插件Z.EntityFramework.Extensions该插件收费。
(一). 简介
1. 相关网站http://www.zzzprojects.com/
2. 下载途径通过Nuget直接下载或者去官网下载(要注意更新最新版本可能会过期)
3. 该程序集包括三个核心模块Bulk SaveChanges、Bulk Operations、Batch Operations
(二).Bulk SaveChanges 大批量保存
1. 核心方法BulkSaveChanges
2. 该方法是在EF原有方法SaveChanges方法上的一个提升。
3. 使用方法增删改操作均使用EF自有的方式最后事务性提交数据库BulkSaveChanges代替SaveChanges
4. 工作原理与SaveChanges类似但是减少了与数据库的往返次数从而提高了性能
5. 性能测试以增加数据为例进行测试
1000条 5000条 10000条
1.606s 6.542s 21.857s
6. 可配置参数 改变这两个参数对性能影响不大
①.BatchSize 批量提交块的大小
②.AllowConcurrency 是否允许并发检查
(三). Bulk Operations
1. 核心方法BulkInsert(增加)、BulkDelete(删除)、BulkUpdate(修改)、BulkMerge(合并)、BulkSynchronize(同步)
其中BulkMerge(合并)、BulkSynchronize(同步)不常用这里不单独测试了。 根据传入的类型可以直接找到对应的表进行操作
2. 工作原理尽可能的减少与数据库的往返次数
3. 性能测试BulkInsert性能进行测试 1000条 5000条 10000条 40000条 1.432s 1.568s 1.554s 1.899s
4. 性能测试BulkDelete性能进行测试 1000条 5000条 10000条 40000条 1.430s 1.542s 1.540s 2.597s
5. 可配置参数 改变这两个参数对性能影响不大
①.BatchSize 批量提交块的大小
②.AllowConcurrency 是否允许并发检查
(四). Batch Operations (批量进行统一操作)
1. 核心方法DeleteFromQuery、UpdateFromQuery
2. 使用方法
①. context.Customers.Where(x x.ID userId).DeleteFromQuery();
②. context.Customers.Where(x x.ID userId).UpdateFromQuery(x new Customer {Actif false});
3. 性能测试 DeleteFromQuery的性能测试 1000条 5000条 10000条 40000条 0.1s 0.127s 0.156s 0.490s
4. 性能测试 UpdateFromQuery的性能测试 1000条 5000条 10000条 40000条 0.120s 0.131s 0.172s 0.437s
二. 代码实战
1. 1.以增加数据为例进行测试BulkSaveChanges(测试数据条数1000,5000,10000) 1 private static void NewMethod1(DbContext db, int count)2 {3 Console.WriteLine(-------------1. 提供BulkSaveChanges方法来替代EF本身的Savechanges------------------);4 Stopwatch watch Stopwatch.StartNew();5 for (int i 0; i count; i)6 {7 TestTwo t new TestTwo();8 t.id Guid.NewGuid().ToString(N);9 t.t21 t1 i;
10 t.t22 t2 i;
11 db.SetTestTwo().Add(t);
12 }
13
14 db.BulkSaveChanges();
15
16 //db.BulkSaveChanges(options
17 //{
18 // options.BatchSize 1000;
19 // options.AllowConcurrency false;
20 //});
21 watch.Stop();
22 Console.WriteLine({0}条数据耗时{1}, count, watch.ElapsedMilliseconds);
23 } 2. 以增加为例测试BulkInsert方法(测试数据条数1000,5000,1w,4w) 1 private static void NewMethod2(DbContext db, int count)2 {3 Console.WriteLine(-------------1. 以增加为例测试BulkInsert方法(测试数据条数1000,5000,1w,4w)------------------);4 Stopwatch watch Stopwatch.StartNew();5 ListTestTwo list new ListTestTwo();6 for (int i 0; i count; i)7 {8 TestTwo t new TestTwo();9 t.id Guid.NewGuid().ToString(N);
10 t.t21 t1 i;
11 t.t22 t2 i;
12 list.Add(t);
13 }
14
15 db.BulkInsert(list);
16
17 //db.BulkInsert(list, p
18 //{
19 // p.BatchSize 100;
20 // p.AllowConcurrency false;
21 //});
22 watch.Stop();
23 Console.WriteLine({0}条数据耗时{1}, count, watch.ElapsedMilliseconds);
24 } 3. 以删除为例测试BulkDelete方法(测试数据条数1000,5000,1w,4w) 1 private static void NewMethod3(DbContext db, int count)
2 {
3 Console.WriteLine(-------------2. 以删除为例测试BulkDelete方法(测试数据条数1000,5000,1w,4w)------------------);
4 Stopwatch watch Stopwatch.StartNew();
5 ListTestTwo list db.SetTestTwo().Take(count).ToList();
6 db.BulkDelete(list);
7 watch.Stop();
8 Console.WriteLine({0}条数据耗时{1}, count, watch.ElapsedMilliseconds);
9 } 4. DeleteFromQuery的性能测试(测试数据条数1000,5000,1w,4w) 1 private static void NewMethod4(DbContext db, int count)
2 {
3 Console.WriteLine(-------------1. DeleteFromQuery的性能测试(测试数据条数1000,5000,1w,4w)------------------);
4 Stopwatch watch Stopwatch.StartNew();
5 db.SetTestTwo().Where(uu.id!fk).DeleteFromQuery();
6
7 watch.Stop();
8 Console.WriteLine({0}条数据耗时{1}, count, watch.ElapsedMilliseconds);
9 } 5. UpdateFromQuery的性能测试(测试数据条数1000,5000,1w,4w) 1 private static void NewMethod5(DbContext db, int count)2 {3 Console.WriteLine(-------------2. UpdateFromQuery的性能测试(测试数据条数1000,5000,1w,4w)------------------);4 Stopwatch watch Stopwatch.StartNew();5 db.SetTestTwo().Where(u u.id ! fk).UpdateFromQuery(x new TestTwo { 6 t211,7 t2228 });9
10 watch.Stop();
11 Console.WriteLine({0}条数据耗时{1}, count, watch.ElapsedMilliseconds);
12 }