提高entity framework 性能,要注意哪些事情
1个回答
展开全部
我发现现在有不少博友,都反对使用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.注意事务的简短性.
在使用事务时,我们要尽量把查询语句或者其他响事务外的语句移在事务外执行.不然让一个事务的时间太长了,就容易引起资源死锁的问题.我上次就优化我一个同事的代码,他代码里就把所所有不相关的东西都放在事务里执行,这样就造成事务的时间太长,当用压力测时,马上就出现资源被锁的错误.
转载,仅供参考。
当然如果对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.注意事务的简短性.
在使用事务时,我们要尽量把查询语句或者其他响事务外的语句移在事务外执行.不然让一个事务的时间太长了,就容易引起资源死锁的问题.我上次就优化我一个同事的代码,他代码里就把所所有不相关的东西都放在事务里执行,这样就造成事务的时间太长,当用压力测时,马上就出现资源被锁的错误.
转载,仅供参考。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询