提高entity framework 性能,要注意哪些事情.
转自:http://www.cnblogs.com/jake1/archive/2013/04/25/3043664.html
我发现现在有不少博友,都反对使用EF框架,说它性能低.其实只要你用的好,性能不是问题,经过测试,它也会接近ado.net的访问了.
当然如果对EF不了解,随便乱用,确实会引来性能问题.因为EF的查询语句都是自己生成的.如果不注意,它会多次查询数据库,或用效率不高的语句去查询.
下面我就把我们在项目中遇到的问题,现我把他总结出来.以供大家参考.当然还有一些没有列出来的,希望各网友也一起提供一下,以避免大家少走弯路.
- 分页的时候,尽量在数据库里面去分页.在我实际中的项目,我就发现我同事由于他不了解EF属性,它的分页都是做在内存中分页.下面请看他的代码.
queryToList().Skip((pageInfo.PageIndex - 1) * pageInfo.PageSize).Take(pageInfo.PageSize);
像上面的语句,他会先把数据从数据库中查出来,然后才分页.
正确的写法应如下:
query.Skip((pageInfo.PageIndex - 1) * pageInfo.PageSize).Take(pageInfo.PageSize).ToList();这样才会在数据库中分页.
2.尽量禁用延迟加载,尽量使用预加载和显式加载查询.
Vs 默认生成的代码,是启用了延迟加载的.这样往往是有些开发人员在不了解的情况下,进行了多次往数据库查询.如下的代码.
using (SchoolContainer db = new SchoolContainer())
{
var list = db.People.Where(ent => ent.PersonID < 30).ToList();
foreach (var people in list)
{
foreach (var ent in people.StudentGrades)
{
Console.WriteLine(ent.Grade);
}
}
}
如果启用延迟加载,这样会造成多次往返数据库查询的.势必造成性能低下.
因此我们在这里应该使用预加载.代码如下:
var list = db.People.Include("StudentGrades").Where(ent => ent.PersonID < 30).ToList();
当然使用了预加载,延迟加载也不会查询多次.但怕在程序员写代码时,忘了要预加载,如果启用了延迟加载,那么就会多次查询数据库.如果不启用,那么程序员就获取不了数据,这样他就马上明白,要进行预加载了.
当然任何事情不是绝对的.如果被查询的对象,过于复杂,就要慎用预加载
3.注意事务的简短性.
在使用事务时,我们要尽 量把查询语句或者其他响事务外的语句移在事务外执行.不然让一个事务的时间太长了,就容易引起资源死锁的问题.我上次就优化我一个同事的代码,他代码里就 把所所有不相关的东西都放在事务里执行,这样就造成事务的时间太长,当用压力测时,马上就出现资源被锁的错误.
4.查询出来的实体,如果不考虑删除和修改,请用NoTracking
关于Notracking 的使用方法,请看. http://www.cnblogs.com/LingzhiSun/archive/2011/04/27/EF_Trick4.html
5.批量删除和修改,不要用先把实体查询出来,然后再逐个删除和修改.这样会产生大量的语句,效率肯定会低.
对于这个解决方式一是直 接用sql语句执行,二是可以用自己写个扩展方法来操作.虽然有不少人反对这方法.但我个人是倾向于自己写个扩展方法.这样,有2个好处.一是给开发人员 使用简单.二是方便管理. 虽然也有网友提出用ObjectStateManager.ChangeObjectState 来实现批量删除,但我是没有找到相关的批量删除方法.而且这个也经常会出异常.
6.使用已编译的查询,虽然到EF5.0, LINQ 查询是自动缓存的.但使用编译查询会比自动缓存的效率高.
使用编译查询,请参照http://msdn.microsoft.com/zh-cn/library/bb896297.aspx.
7.预生成视图,
具体操作如下:
8.还有一点,就是对于复杂的查询,我们要随时监控生成的查询语句.
毕竟EF生成的语句,往往比我们生成的语句更加复杂,这个时候我们就要考虑是否通过其他方式来提高性能.
9.更多EF性能优化,请参考http://msdn.microsoft.com/zh-cn/library/cc853327.aspx
提高entity framework 性能,要注意哪些事情.的更多相关文章
- Entity Framework性能优化
AsNonUnicode 执行如下语句,并用SqlProfiler监控其SQL: var list = WMFactory.ReChargeMobile.Queryable().Where(w =&g ...
- Entity Framework性能影响因素分析
1.对象管理机制-复杂为更好的管理模型对象,EF提供了一套内部管理机制和跟踪对象的状态,保存对象一致性,使用方便,但是性能有所降低. 2.执行机制-高度封装在EF中,所有的查询表达式都会经过语法分析. ...
- [转载] - Entity Framework 性能优化建议
1.对象管理机制-复杂为更好的管理模型对象,EF提供了一套内部管理机制和跟踪对象的状态,保存对象一致性,使用方便,但是性能有所降低. 2.执行机制-高度封装在EF中,所有的查询表达式都会经过语法分析. ...
- 浅析Entity FrameWork性能优化
浅析EF性能优化 1. 数据Load 延迟加载:当实体第一次读取时,相关数据没有加载:当第一次试图访问导航属性时,所需的导航数据自动加载,EF默认使用这种方式加载数据,尽量使用预先加载和显 ...
- Entity Framework 项目使用心得
在博客园很久了,一直只看不说,这是发布本人的第一个博客. 总结一下在项目中,EntityFramework使用的一下经验拿来和大家分享,希望对大家有用~ 1. 在Entity Fram ...
- Entity Framework技巧系列之三 - Tip 9 – 12
提示9. 怎样直接删除一个对象而无需检索它 问题 最常见的删除Entity Framework中实体的方式是将你要删除的实体传入Context中并像如下这样删除: 1 // 按ID查找一个类别 2 / ...
- LINQ TO SQL和Entity Framework 的关系 你了解多少?
1. LINQ TO SQL 和EF 特点: LINQ TO SQL和Entity Framework都是一种包含LINQ功能的ORM 也就是所谓的关系对象的映射.其中包括的有DBFrist ...
- Entity Framework 6 开发系列 目录
2014 年开始接触 Entity Framework 6 也快两年,用它已经沉淀了一个成熟架构,也用来开发了不少大大小小的产品和项目,直到这段时间,才真正有时间来回顾,重新学习它,为让大家更加了解E ...
- NHibernate与EF(Entity Framework)的区别
http://www.cnblogs.com/lukun/archive/2011/05/16/2047587.html NHibernate与EF(Entity Framework)的区别 http ...
随机推荐
- jQuery如何阻止子元素继承父元素事件?
<a> <b></b> </a> $("a").click(...); 这种绑定的话,b也会响应一次事件,如何只对a元素绑定事件,而 ...
- gcc 生成动态库时-fpic选项是什么意思。
-f后面跟一些编译选项,PIC是其中一种,表示生成位置无关代码(Position Independent Code)
- linux-信号。
信号 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的. 信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到 ...
- Shell符号展开
字符 展开 * 这个 “*” 字符意味着匹配文件名中的任意字符 shell 把 “*” 展开成了另外的东西 ,在 echo 命令被执行前. ~家目录 算术表达式展开 算术表达式展开使用这种格式: $( ...
- NPOI2.0
今天在使用NPOI2.0读取上传excel文件(excel2010)时,报了一个很奇怪的错误:无效的 URI: 未能分析主机名. 在网上查找了下找到的出错情况跟这个完全不着边际,没有办法只有自己去测试 ...
- 负载均衡-多台机子session不起效:把php.ini中file改为memcache存储
一 开启memcache服务 二 修改php.ini中session配置 php/lib/php.ini session.save_handler = memcache session.save_pa ...
- C语言中输入输出格式控制
1.C语言中,非零值为真,真用1表示:零值为假,假用0表示. 2.转义字符参考: \a 蜂鸣,响铃 \b 回退:向后退一格 \f 换页 \n 换行 \r 回车,光标到本行行首 \t 水平制表 \v 垂 ...
- PHP图片上传程序(完整版)
从PHP100上搜刮来的,功能很强大.几乎考虑到了每个细节,与大家分享!~~~ <meta http-equiv="Content-Type" content="t ...
- VS2013发布web项目到IIS上遇到的问题总结
vs2010发布网站到本地IIS的步骤 http://blog.csdn.net/cx_wzp/article/details/8805365 问题一:HTTP 错误 403.14 - Forbid ...
- EF5.0 对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性
使用asp.net+EF5.0练习的时候,遇到这样一个问题: 对一个或多个实体的验证失败.有关详细信息,请参见“EntityValidationErrors”属性 但是感到很疑惑,去百度,说是关闭EF ...