自从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性能优化篇相关推荐

  1. 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

    2019独角兽企业重金招聘Python工程师标准>>> 上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六)  中, 介绍了 ...

  2. 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五)...

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  3. 秋色园QBlog技术原理解析:性能优化篇:打印页面SQL,全局的SQL语句优化(十三)...

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  4. 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及超级分库分散并发方案(十六)...

    上节回顾: 上节 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五) 中, 介绍了 秋色园QBlog 在性能优化方面,从技术的优化手段,开始步入数据库设计优化,并从数据的 ...

  5. C语言嵌入式系统编程修炼之道——性能优化篇

    C语言嵌入式系统编程修炼之道--性能优化篇 作者:宋宝华  e-mail:[email]21cnbao@21cn.com[/email] 1.使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法.对于嵌 ...

  6. 在网上看到和篇关于sql server 2005的性能优化篇,觉得写得很好。

    在网上看到和篇关于sql server 2005的性能优化篇,觉得写得很好. SQL Server2005扩展函数已经不是一件什么新鲜的事了,但是我看网上的大部分都是说聚合函数,例子也比较浅,那么这里 ...

  7. Android进阶:性能优化篇 Android进阶:性能优化篇

    Android进阶:性能优化篇 分类:Android 性能优化2011-08-09 17:06585人阅读评论(0)收藏举报 一.在使用Gallery控件时,如果载入的图片过多,过大,就很容易出现Ou ...

  8. c语言学习进阶-C语言程序性能优化

    标题C语言程序性能优化 (1)进一步提升程序的计算能力.使之能计算任意实数的任意次方的输出结果,我们 将计算的次方数也放在命令行参数中,作为第3 个命令行参数,例如:d:>p.exe input ...

  9. Java虚拟机学习总结(2)——性能优化的一般性原则、层次与通用方法

    一.性能优化的一般性原则 (1).依据数据而不是凭空猜测 性能优化的第一原则是当我们怀疑性能有问题的时候,应该通过测试.日志.profillig来分析出哪里有问题,有的放矢,而不是凭感觉.撞运气.一个 ...

最新文章

  1. 深度强化学习实战:Tensorflow实现DDPG - PaperWeekly 第48期
  2. 和gdi绘图效率比较_堪称效率神器!5款日常插件分享,错过哪一个都无比遗憾...
  3. 《微软开源跨平台移动开发实践》团购通知
  4. QT:不停的提示“文件已改变”
  5. STM32 FSMC/FMC原理保姆级讲解(一)
  6. Unity3D之NGUI基础8:UI锚点与深度
  7. ELM327 OBD to RS232 Interpreters
  8. 【7gyy】教大家设置一个类似手机的锁屏界面
  9. 自制一个SD/TF的读卡器
  10. 【ZT】记住这些,或许可以救你一命!!【强力推荐帖!】
  11. apm软件仿真+QGC地面站 环境搭建
  12. url rewrite 实现url地址的伪静态化
  13. 2006中国企业500强名单
  14. if函数三个条件怎么填c语言,if同时满足三个条件怎么写
  15. 【OpenCV-系列2】01OpenCV简介
  16. MAC_Excel针对时间维度汇总生成表格
  17. PROTEUS最新版本下载CSDN_233乐园小游戏下载最新版本-233乐园小游戏下载并安装下载免费...
  18. 行列式基础(《线性代数》学习笔记)
  19. 纯AS3.0制作的美女找茬游戏
  20. python-旋转平移(仿射变换矩阵)

热门文章

  1. Submit和execute的区别
  2. android 图片居中代码怎么写,Android:将图片居中
  3. excel数据复制粘贴入PL/SQL Developer的方法
  4. 眼睛貌似开始有飞蚊症了,而且越来越严重,让人担忧
  5. 让文字在图片上滚动显示
  6. 计算机毕业设计Java动物防疫信息管理(源码+系统+mysql数据库+lW文档)
  7. Unity播放带Alpha通道的视频【WebM+Video Player】(替代播放GIF方案)
  8. 我们知道CDN护航了双11十年,却不知道背后有那么多故事……
  9. 菜鸟如何历练成ACE总监
  10. 从莉莉丝游戏的战略布局与设计角度,探究《剑与远征》的火爆原因