EF学习和使用(七)EF性能优化篇
自从ITOO平台旗下的评教系统问世之后,其性能问题引起了轩然大波。CPU占用过高,页面反映速度超慢,根本无法正常使用,为此我们专门成立一个性能优化小队,去研究为什么系统性能这么低,怎么优化性能?
框架中用到了EntityFramework,WCF,EasyUI等技术,所以我们大胆猜测可能是这三方面影响了系统的整体性能。经过一段时间的研究和实践,发现我们在使用EF的过程中,由于经验原因对EF的不了解,不经意写的一些代码都会在一定程度上影响系统的性能。
下面总结了一些在使用EF的过程中应当特别注意的地方,避免大家再走弯路。
1、分清真分页和假分页
大家都知道分页分为真分页和假分页,并且假分页是特别耗费性能的。我们在使用的过程中也是以真分页为主,但是在使用EF写分页语句的时候,稍有不慎,真分页便会成为假分页:
query.ToList().Skip((PageIndex - 1) * PageSize).Take(PageSize);query.Skip((PageIndex - 1) * PageSize).Take(PageSize).ToList();
上面两句话乍一看差不多,并且都会实现我们分页的需求。但是这两句的执行过程,生成的sql语句大有不同。第一条语句的执行过程是:
a.先把数据全部都查询出来,放到内存中
b.转换成List
c.从List中进行分页操作,查询出结果。 这其实是假分页的效果。
而第二条语句就是真分页了,将参数传到数据库,生成分页sql语句,在数据库中查询出结果。
2.合理使用EF的加载方式
选择什么样的数据加载方式需要因时而异,如果选择不当很可能会影响系统性能,每一种数据加载方式都有它存在的意义,但目的只有一个,那就是以最少的代价获取到需要的数据。
关于EF几种加载方式的详细介绍:
EF学习和使用(五)Lazy Loading and Eager Loading
EF学习和使用(六)显式加载、按需加载
3.注意事务的简短性
在使用事务时,我们尽量要把与事务无关的东西放到事务外执行,比如(查询语句或者其他事务外的语句),如果让一个事务的执行时间过长,很容易引起资源死锁的问题,当用压力测时,马上就出现资源被锁的错误。
4.NoTracking的使用
查询出来的实体,如果不需要删除和修改,请用NoTracking查询。
using (var context = new MyDbContext()){ var people = context.People.Where(p => p.PersonID > 100).AsNoTracking().ToList();}
有时我们的实体只需要显示,无需更新,所以为了提高性能,我们不需要实体被EF context追踪。此时可以使用NoTracking的查询来得到实体,这样实体的状态会是Detached状态。
5.对于逻辑相对复杂的查询,要随时监控生成的Sql语句。
毕竟EF生成的语句,往往比我们生成的语句更加复杂,这个时候我们就要考虑是否通过其他方式来提高性能。比如自己写原生的sql语句,有时候原生SQL语句是更好的选择。另外我们要善于使用SQL Server Profiler这个工具,实时监控生成的sql语句。
6.批量删除和修改
不知道你是否研究过EF的插入删除和修改操作,当你批量操作数据的时候,通过SQL Server Profiler可以明显看到产生了大量的Insert,Update语句,效率非常低;因为他插入一条数据,会对应生成一条Insert语句,当你的list中有10万条数据时,就会生成10万条插入语句!不过还好咱们有对策:Entity Framework Extendeds ,EF扩展类完美解决批量操作问题。篇幅原因,详见下回分解。
因为系统数据量暂时不大的原因,做了这些改变之后,性能提升并不是特别明显。但是积少成多,一点点的优化或进步我们都要争取。当系统数据量到了一定程度后,你会发现,这一点点的改变带给你的效果,将不只是一点点。
关于EF性能的研究,暂时涉及到了这些,后续将继续完善,敬请期待!
EF学习和使用(七)EF性能优化篇相关推荐
- 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)
2019独角兽企业重金招聘Python工程师标准>>> 上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六) 中, 介绍了 ...
- 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五)...
文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...
- 秋色园QBlog技术原理解析:性能优化篇:打印页面SQL,全局的SQL语句优化(十三)...
文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...
- 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及超级分库分散并发方案(十六)...
上节回顾: 上节 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五) 中, 介绍了 秋色园QBlog 在性能优化方面,从技术的优化手段,开始步入数据库设计优化,并从数据的 ...
- C语言嵌入式系统编程修炼之道——性能优化篇
C语言嵌入式系统编程修炼之道--性能优化篇 作者:宋宝华 e-mail:[email]21cnbao@21cn.com[/email] 1.使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法.对于嵌 ...
- 在网上看到和篇关于sql server 2005的性能优化篇,觉得写得很好。
在网上看到和篇关于sql server 2005的性能优化篇,觉得写得很好. SQL Server2005扩展函数已经不是一件什么新鲜的事了,但是我看网上的大部分都是说聚合函数,例子也比较浅,那么这里 ...
- Android进阶:性能优化篇
Android进阶:性能优化篇
Android进阶:性能优化篇 分类:Android 性能优化2011-08-09 17:06585人阅读评论(0)收藏举报 一.在使用Gallery控件时,如果载入的图片过多,过大,就很容易出现Ou ...
- c语言学习进阶-C语言程序性能优化
标题C语言程序性能优化 (1)进一步提升程序的计算能力.使之能计算任意实数的任意次方的输出结果,我们 将计算的次方数也放在命令行参数中,作为第3 个命令行参数,例如:d:>p.exe input ...
- Java虚拟机学习总结(2)——性能优化的一般性原则、层次与通用方法
一.性能优化的一般性原则 (1).依据数据而不是凭空猜测 性能优化的第一原则是当我们怀疑性能有问题的时候,应该通过测试.日志.profillig来分析出哪里有问题,有的放矢,而不是凭感觉.撞运气.一个 ...
最新文章
- 深度强化学习实战:Tensorflow实现DDPG - PaperWeekly 第48期
- 和gdi绘图效率比较_堪称效率神器!5款日常插件分享,错过哪一个都无比遗憾...
- 《微软开源跨平台移动开发实践》团购通知
- QT:不停的提示“文件已改变”
- STM32 FSMC/FMC原理保姆级讲解(一)
- Unity3D之NGUI基础8:UI锚点与深度
- ELM327 OBD to RS232 Interpreters
- 【7gyy】教大家设置一个类似手机的锁屏界面
- 自制一个SD/TF的读卡器
- 【ZT】记住这些,或许可以救你一命!!【强力推荐帖!】
- apm软件仿真+QGC地面站 环境搭建
- url rewrite 实现url地址的伪静态化
- 2006中国企业500强名单
- if函数三个条件怎么填c语言,if同时满足三个条件怎么写
- 【OpenCV-系列2】01OpenCV简介
- MAC_Excel针对时间维度汇总生成表格
- PROTEUS最新版本下载CSDN_233乐园小游戏下载最新版本-233乐园小游戏下载并安装下载免费...
- 行列式基础(《线性代数》学习笔记)
- 纯AS3.0制作的美女找茬游戏
- python-旋转平移(仿射变换矩阵)
热门文章
- Submit和execute的区别
- android 图片居中代码怎么写,Android:将图片居中
- excel数据复制粘贴入PL/SQL Developer的方法
- 眼睛貌似开始有飞蚊症了,而且越来越严重,让人担忧
- 让文字在图片上滚动显示
- 计算机毕业设计Java动物防疫信息管理(源码+系统+mysql数据库+lW文档)
- Unity播放带Alpha通道的视频【WebM+Video Player】(替代播放GIF方案)
- 我们知道CDN护航了双11十年,却不知道背后有那么多故事……
- 菜鸟如何历练成ACE总监
- 从莉莉丝游戏的战略布局与设计角度,探究《剑与远征》的火爆原因