第九节: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解决EF的性能问题
2017-10-29 22:01
661 查看
一. 综述
该模块主要介绍: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)
2. 以增加为例,测试BulkInsert方法(测试数据条数:1000,5000,1w,4w)
3. 以删除为例,测试BulkDelete方法(测试数据条数:1000,5000,1w,4w)
4. DeleteFromQuery的性能测试(测试数据条数:1000,5000,1w,4w)
5. UpdateFromQuery的性能测试(测试数据条数:1000,5000,1w,4w)
该模块主要介绍: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)
private static void NewMethod1(DbContext db, int count) { Console.WriteLine("-------------1. 提供BulkSaveChanges方法来替代EF本身的Savechanges------------------"); Stopwatch watch = Stopwatch.StartNew(); for (int i = 0; i < count; i++) { TestTwo t = new TestTwo(); t.id = Guid.NewGuid().ToString("N"); t.t21 = "t1+" + i; t.t22 = "t2+" + i; db.Set<TestTwo>().Add(t); } db.BulkSaveChanges(); //db.BulkSaveChanges(options => //{ // options.BatchSize = 1000; // options.AllowConcurrency = false; //}); watch.Stop(); Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds); }
2. 以增加为例,测试BulkInsert方法(测试数据条数:1000,5000,1w,4w)
private static void NewMethod2(DbContext db, int count) { Console.WriteLine("-------------1. 以增加为例,测试BulkInsert方法(测试数据条数:1000,5000,1w,4w)------------------"); Stopwatch watch = Stopwatch.StartNew(); List<TestTwo> list = new List<TestTwo>(); for (int i = 0; i < count; i++) { TestTwo t = new TestTwo(); t.id = Guid.NewGuid().ToString("N"); t.t21 = "t1+" + i; t.t22 = "t2+" + i; list.Add(t); } db.BulkInsert(list); //db.BulkInsert(list, p => //{ // p.BatchSize = 100; // p.AllowConcurrency = false; //}); watch.Stop(); Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds); }
3. 以删除为例,测试BulkDelete方法(测试数据条数:1000,5000,1w,4w)
private static void NewMethod3(DbContext db, int count) { Console.WriteLine("-------------2. 以删除为例,测试BulkDelete方法(测试数据条数:1000,5000,1w,4w)------------------"); Stopwatch watch = Stopwatch.StartNew(); List<TestTwo> list = db.Set<TestTwo>().Take(count).ToList(); db.BulkDelete(list); watch.Stop(); Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds); }
4. DeleteFromQuery的性能测试(测试数据条数:1000,5000,1w,4w)
private static void NewMethod4(DbContext db, int count) { Console.WriteLine("-------------1. DeleteFromQuery的性能测试(测试数据条数:1000,5000,1w,4w)------------------"); Stopwatch watch = Stopwatch.StartNew(); db.Set<TestTwo>().Where(u=>u.id!="fk").DeleteFromQuery(); watch.Stop(); Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds); }
5. UpdateFromQuery的性能测试(测试数据条数:1000,5000,1w,4w)
private static void NewMethod5(DbContext db, int count) { Console.WriteLine("-------------2. UpdateFromQuery的性能测试(测试数据条数:1000,5000,1w,4w)------------------"); Stopwatch watch = Stopwatch.StartNew(); db.Set<TestTwo>().Where(u => u.id != "fk").UpdateFromQuery(x => new TestTwo { t21="1", t22="2" }); watch.Stop(); Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds); }
相关文章推荐
- 解决 EF 分层查询的一个性能问题[转]
- AutoDetectChangesEnabled及AddRange解决EF插入的性能问题
- 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题 第四节:一些指令总结 定时调度系列之Quartz.Net详解 第十七节:易混淆的概念(静态和非静态、拆箱和装箱) 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)
- 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题
- [图灵beta]如何解决Oralce的性能问题?
- Redis 常见的性能问题和解决方法
- 利用复合索引解决性能问题一例
- web应用,大的用户量该如何解决性能问题
- 如何解决秒杀的性能问题和超卖的讨论
- session存放数据过大导致频繁GC影响服务器性能以及高并发问题解决
- 如何解决WEB性能测试中的验证码问题
- Redis常见的性能问题和解决方法
- mybatis批量插入oracle大量数据记录性能问题解决
- MVC3+EF4.1学习系列(十一)----EF4.1常见的问题解决(转)
- 游标脚本性能问题解决与分析 (1) - Cursor Performance Analysis
- 五大Linux简单命令解决系统性能问题
- 检测和解决Android应用的性能问题
- 解决Java/MySQL性能问题的思路
- Java EE应用中的性能问题解决方案 — 第一部分 内存溢出和JVM内存管理内幕(B)
- 构、搜索、性能等技术角度分析了电子商务网站重点要解决的几个问题,并给出一些建议和方案