第九节: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解决EF的性能问题
一. 综述
该模块主要介绍: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 = ; 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 = ; 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="",
t22=""
}); watch.Stop();
Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds);
}
第九节: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解决EF的性能问题的更多相关文章
- 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题
一. 开篇说明 EF的性能问题一直以来经常被人所吐槽,究其原因在于“复杂的操作在生成SQL阶段耗时长,且执行效率不高”,但并不是没有办法解决,从EF本身举几个简单的优化例子: ①:如果仅是查询数据,并 ...
- 【EF】解决EF批量操作,Z.EntityFramework.Extensions 过期方案
方案一: 使用EntityFramework.Extended优点: 启下载量是Z.EntityFramework.Extensions的10倍+ 不会过期缺点:不能批量Insert 方案二:解决批量 ...
- EF批量插入数据(Z.EntityFramework.Extensions)
EF用原生的插入数据方法DbSet.ADD()和 DbSet.AddRange()都很慢.所以要做大型的批量插入只能另选它法. 1.Nugget 2.代码 using EF6._0Test.EF; u ...
- 第八节: EF的性能篇(一) 之 EF自有方法的性能测试
一. 开发中常见的性能问题 我们在日常开发过程中,由于一些不好的习惯,经常会导致所写的代码性能低下,却毫无发觉,下面就总结一下常见的一些性能问题. 1. 真假分页 ① 假分页: db.xxx.toLi ...
- 第九节:基于MVC5+AutoFac+EF+Log4Net的基础结构搭建
一. 前言 从本节开始,将陆续的介绍几种框架搭建组合形式,分析每种搭建形式的优势和弊端,剖析搭建过程中涉及到的一些思想和技巧. (一). 技术选型 1. DotNet框架:4.6 2. 数据库访问:E ...
- ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪
ASP.NET MVC深入浅出(被替换) 一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...
- Redis性能篇(二)CPU核和NUMA架构的影响
Redis被广泛使用的一个很重要的原因是它的高性能.因此我们必要要重视所有可能影响Redis性能的因素.机制以及应对方案.影响Redis性能的五大方面的潜在因素,分别是: Redis内部的阻塞式操作 ...
- 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇
前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...
- 【朝花夕拾】Android性能篇之(六)Android进程管理机制
前言 Android系统与其他操作系统有个很不一样的地方,就是其他操作系统尽可能移除不再活动的进程,从而尽可能保证多的内存空间,而Android系统却是反其道而行之,尽可能保留进程.An ...
随机推荐
- adb.exe 安卓测试桥的使用
一.android SDK提供了几个工具 (在SDK下build-tools目录下的工具) dx.bat ----------->把java编译器编译生成的.class 文件 ,变成一个文件,让 ...
- TypeScript——初步认识
JavaScript的痛点 众所周知,前端开发“三剑客”分别是HTML.CSS以及JS,其中JS由于其灵活简单等特点获得了大家的青睐,但是成也萧何败萧何,由于JS设计初衷是浏览器的嵌入式脚本语言,作为 ...
- iowait 过高问题的查找及解决linux
Linux 有许多可用来查找问题的简单工具,也有许多是更高级的 I/O Wait 就是一个需要使用高级的工具来debug的问题,当然也有许多基本工具的高级用法.I/O wait的问题难以定位的原因是因 ...
- Java线程状态转换
前言:对于Java线程状态方面的知识点,笔者总感觉朦朦胧胧,趁着最近整理资料,将Java线程状态方面的知识点总结归纳,以便加深记忆. 1.Java线程状态值 在Thread类源码中通过枚举为线程定义了 ...
- C. Maximal Intersection(STL)
这道题,关键在于怎么求多个区间的交集,使用multiset就可以 分别将 r , l 存在不同的mutiset中. 然后,我们来看一下 是不是 交集的 l 是最大的, 交集的 r 是最小的 #incl ...
- springboot为导出的pdf和excel加水印
相信很多小伙伴们在做导出pdf或者excel文件时会被要求在文件上加上水印,本篇博客就来讲讲如何为pdf和excel加水印. 导出pdf加水印 其实在导出pdf时加上水印并不难,因为itext提供了添 ...
- 点击button自动刷新页面的奇葩错误
以前在写练习的时候遇到过这样一个问题,自己在html中写了一个button <button>test1</button> 在没有给其附上onclick事件时是点击是不会有任何反 ...
- ubuntu安装docker{ubuntu16.04下安装docker}
一.开始安装 第一步: 由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本: $ sudo apt-get remove docker docker-engine d ...
- Spring常用配置示例
Spring 是一款Java平台的开源框架,是为解决企业级应用程序开发的复杂性而创建的,通过良好的分层架构让开发人员能够专注于业务逻辑的开发. Spring框架是一个分层架构,由不同的模块组成,构成s ...
- .NET Core 开源工具 IPTools - 快速查询 IP 地理位置、经纬度信息
快速查询IP信息,支持国内和国外IP信息查询,支持查询经纬度,地理位置最高支持到城市. 1. IPTools.China 快速查询中国IP地址信息,包含国家.省份.城市.和网络运营商.非中国IP只支持 ...