Entityframework 性能优化

在谈谈EF的性能优化之前请允许笔者废话几句。虽然说笔者以前有接触EF,但真正意义上的接触EF算是今年的8月份吧!那时公司里面有一个产品模块化的项目需要用到ORM。当时有两个选择1.EF,2.NHibernate。 说实在的两者的口碑都不怎么样...最后我还是支持了下微软的EF,毕竟做.Net开发用自家的会方便很多把。一开始在网上查得的一些博文会说EF各种性能不好!(PS:今天跟客户谈项目的时候又被喷了)不过我还是傻里傻气的保持乐观的态度,性能不好就想办法让它好起来!!!不做怎么知道呢!下面我一些优化的方案一一列举出来(目前只总结了查询),写的不准确的地方,还希望大家能够指出来。

说到EF性能优化不得不说一个工具MiniProfiler,(不过也可以直接用Sqlserver profiler)MiniProfiler是StackOverFlow团队设计的一款对.net的性能分析小程序。在这里我们可以使用MiniProfiler嵌入页面查看页面处理的周期和Sql语句执行的周期及Sql语句。

可以通过以下步骤来使用它:(环境.NET4.0 + EntityFramewrok4.4)

1.通过Nuget下载MiniProfiler和MiniProfiler.EF (MiniProfiler.EF5兼容EntityFramework5.0以下的版本)

2.修改Global.asax文件,添加如下代码

protected void Application_Start()
{
    //SQL跟踪
    StackExchange.Profiling.MiniProfilerEF.Initialize();
}

protected void Application_BeginRequest()
{
    MiniProfiler.Start();
}

protected void Application_EndRequest()
{
    MiniProfiler.Stop();
}

3.在需要调试的页面中使用它,需要在_Layout.cshtml添加MiniProfiler的引用(我这里使用的是ASP.NET MVC)

//引用
@using StackExchange.Profiling
//Body
@MiniProfiler.RenderIncludes()

若是在页面中出现如下画面就表示MiniProfiler已经配置成功了,可以进入正式进入优化的环节了!!!

具体解决问题我总结了下有几个方案:

1.使用EntityFramework5及以上的版本代替EF4.0及以下的版本(使用.Net4.0的可以略过)
2.禁用延迟加载

默认情况下,延迟加载被支持,如果你希望禁用它,必须显式声明,最好的位置是在 DbContext 的构造器中。

public MyContext()
{
    this.Configuration.LazyLoadingEnabled = false;
} 

因为若使用延迟加载,每次我们需要访问属性的时候都会访问数据这样累加起来的开销是很大的。

3.使用贪婪加载(又叫预加载就是数据库的多表查询)
这点其实也跟上面的一样响应了一个原则尽量的减少数据库的访问次数,

articles = dbContext.Articles.Include("Category");

4.尽量在sql语句拼凑好的时候进行ToList()或者遍历IQueryable<T>,因为一旦调用IQueryable<T>就相当于进行的数据库的查询
错误写法:

dbContext.Articles.ToList().Where(u=>u.id==1);

正确写法:

dbContext.Articles.Where(u=>u.id==1).ToList();

这些写法的意思就是把数据拼凑好,再访问数据库。不然就成了从数据库获取全部数据就再过滤,假如数据库有几万甚至几十万数据。那就不得了了!
这里再提供一个筛选+分页的写法(很好用)

var model =
dbContext.MyModules.OrderByDescending(u => u.CreateTime).Skip((pageInfo.PageIndex - 1) * pageInfo.PageSize).Take(pageInfo.PageSize).Select(u => new
{
    u.ID,
    u.Name,
    u.Version,
    u.TagList,
    u.UserID,
    u.DownLoadTimes,
    u.CreateTime
}).ToList();

5.缓存数据
尽量把频繁用到的数据一次性加载到内存当中,适应一些频繁调用数据库进行计算的功能(好像跟第4调有些冲突,但是又的时候减少数据库访问次数反而更好。具体问题具体分析了)
我项目中有个导航菜单就是频繁的访问数据库导致性能低下(一开始得到1级菜单,然后通过1级获取2级菜单,2级获取3级....)
解决方法就是一次性把所有数据载入内存,然后通过内存进行检索,时间马上就降了3s左右。相对这种情况其实还是比较多的!

说了这么多,总结一下就两点:
1.保证拼凑的sql语句性能要高
2.减少数据库的访问次数

可能大牛觉得这估计都是废话!不过这些方法还是挺适合中下阶级的。
不足的以后再补充~!

时间: 2024-12-11 12:39:28

Entityframework 性能优化的相关文章

C#中 EF(EntityFramework) 性能优化

现在工作中很少使用原生的sql了,大多数的时候都在使用EF.刚开始的时候,只是在注重功能的实现,最近一段时间在做服务端接口开发.开发的时候也是像之前一样,键盘噼里啪啦的一顿敲,接口秒秒钟上线,但是到联调测试的时候就悲剧了....那叫一个慢啊,客户端有种"千年等一回的赶脚" .由于访问量和数量都提升了一个数量级,之前没有 考虑过的问题,都在此时暴露了,根据自己百度.google的经历实践,整理了这一些优化点.欢迎各位大神批评指正! 1.使用AsNoTracking(),无跟踪查询,查询出

使用EntityFrameWork 5.0面向存储过程(&amp;执行Sql,性能优化)

EntityFrameWork5.0简单使用 概要: 使用EntityFrameWork5.0执行存储过程,Sql语句(DDL/DML)以及一点关于优化性能的方面; 正文: 在myef.tt下会包含需要展示数据的存储过程(select) 模型浏览器如下, 1.EF如何调用存储过程: Note:数据库的表对应的实体,以类对象表示,在EF容器下可以直接操作,比如db.UserAccount直接拿到UserAccount实体对象,存储过程,视图也是同样道理,也是可以通过EF上下文容器得到; 2.EF执

EntityFramework之原始查询及性能优化(六)

前言 在EF中我们可以通过Linq来操作实体类,但是有些时候我们必须通过原始sql语句或者存储过程来进行查询数据库,所以我们可以通过EF Code First来实现,但是SQL语句和存储过程无法进行映射,于是我们只能手动通过上下文中的SqlQuery和ExecuteSqlCommand来完成. SqlQuery sql语句查询实体 通过DbSet中的SqlQuery方法来写原始sql语句返回实体实例,如果是通过Linq查询返回的那么返回的对象将被上下文(context)所跟踪. 首先给出要操作的

C#实用杂记-EF全性能优化技巧

原文链接:http://www.makmong.com/947.html#comment-31 EntityFramework 优化建议 2016年1月15日 下午4:54 LEILINKANG Entity Framework目前最新版本是6.1.3,当然Entity Framework 7 目前还是预览版,并不能投入正式生产环境,估计正式版16年第一季度会出来,了解过EF7的部分新特性后,还是狠狠期待一下滴. EF性能问题一直为开发者所诟病,最让人纠结的也是这块,所以此次我也来谈谈EF的性能

EF6 的性能优化

引言 EntityFramework 6 作为微软的开源ORM框架,有着得天独厚的优势.微软也在MVC中主推EF做为ORM框架.但是在实际的项目开发中我们总是感觉到EF有些慢,或者有这样那样的问题.但实际上有时是因为我们滥用导致了问题的出现.本章就像对EF的性能优化方面的内容做个抛砖引玉,希望能给大家一点启发或者帮助. 常见的提升性能的方案 参考 Tips to improve Entity Framework Performance Async Processing in EF6 and th

iOS开发——项目实战总结&amp;UITableView性能优化与卡顿问题

UITableView性能优化与卡顿问题 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候,就会堆积很多cell.如果重用cell,为cell创建一个ID 每当需要显示cell 的时候,都会先去缓冲池中寻找可循环利用的cell,如果没有再重新创建cell 2.避免cell的重新布局 cell的布局填充等操作 比较耗时,一般创建时就布局好 如可以将cell单独放到一个自定义类,初始化时就布局好

Java性能优化之JVM GC(垃圾回收机制)

Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成.GC优化很多时候就是减少stop-the-world 的发生. JVM GC回收哪个区域内的垃圾? 需要注意的是,JV

Spark性能优化指南——高级篇

Spark性能优化指南--高级篇 [TOC] 前言 继基础篇讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化指南>的高级篇,将深入分析数据倾斜调优与shuffle调优,以解决更加棘手的性能问题. 数据倾斜调优 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数据倾斜发生时的现象 绝大多数tas

Mysql数据库性能优化(一)

参考 http://www.jb51.net/article/82254.htm 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库. mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面