EntityFramework5的性能到底提高在哪里了?
微软官方数据说,EF5.0的性能比EF4.x提高了很多倍。但是到底EF5.0为什么会比EF4.x提高那么多倍呢?到底是对哪一部分进行了性能优化呢?今天我们就来一探究竟。
为了解释这一问题,引入一段普通的数据库查询代码:
{
var allFoods = from p in db.Products
where p.CategoryId == "FOOD"
orderby p.Name
select p;
Product productss = allFoods.First();
}
上面代码非常好理解,就是查找符合条件的第一个food,延迟查询,真正查询是在First()执行的时候开始的,这个大家都懂,但是大家知道在执行这段代码的时候EntityFramework为我们做了哪些工作吗?让我们一步一步分析一下这段代码:
首先:
using (var db = new ProductContext()) 这个没什么好解释的,就是创建一context对象。
其次:
var allFoods = from p in db.Products
where p.CategoryId == "FOOD"
orderby p.Name
select p;
这段代码是查询表达式的创建,因为是延迟查询,所以并未做任何工作,仅仅是一段用Linq语法写的代码而已。
最后:
Product productss = allFoods.First();
这句代码才是今天的主题部分,让我们对他进行一些内部的跟踪:
1.元数据加载
2.视图的生成
3.解析linq查询中的参数
4.查询转换 就是将Linq语句通过linq引擎转化为SQL语句
5.生成具体的查询字符串,为数据库查询做实质性的准备
6.数据库查询 ,分为以下三个步骤,也就是我们以前经产用的ADO.NET查找数据过程
*Connection.open()
*Command.ExcuteReader()
*DataReader.Read()
7.通过查询的数据库生成实体对象,也就是我们查询拿到的结果对象集
8. Connection.Close()
上面的过程是整个EF进行一次数据查询的过程, 之所以介绍这个,希望读到这篇文章的您能理解EF到底为我们做了些什么东西?知道了这些过程,之后再对这些过程进行一些性能分析,真正解析EF5在性能上为什么快于EF4? 微软到底在哪个过程做了手脚。
之前我在http://www.cnblogs.com/A_ming/archive/2012/08/17/2643266.html一文中提到过
“第一次通过Linq to Entity 查询性能与之前版本几乎一样,但第二次及以后在进行同样查询就大大不一样了”
这里提到的第一次查询,称之为“冷查询”
第二次进行相同的查询,称之为”热查询“
但是不管是”冷查询“还是”热查询“,都要经历以上我们刚刚讨论的步骤,但是在每一步所花费的时间可就不一样了,这也就是为什么热查询要快于冷查询的原因了,究其原因在于Cache,请看下表:
冷查询:
EF4性能表现 EF5性能表现
1.元数据加载 影响很大,但做Cache 影响很大,但做Cache
2.视图的生成 可能影响很大,但做Cache 可能影响很大,但做Cache
3.解析linq查询中的参数 影响一般 影响很小(性能改善了)
4.查询转换 影响一般 影响一般,但做Cache
5.生成具体的查询字符串 影响一般,但做Cache 影响一般,但做Cache
6.数据库查询 可能会非常高 可能会非常高
*Connection.open() (在某些情况下进行了一定处理,性能提高)
*Command.ExcuteReader()
*DataReader.Read()
7.通过查询的数据库生成实体对象 影响一般 影响一般
8. Connection.Close() 影响一般 影响一般
热查询:
EF4性能表现 EF5性能表现
1.元数据加载 打 很低,因为在冷查询中做了cache 很低,有Cache缘故
2.视图的生成 很低,原因同上 很低,同上
3.解析linq查询中的参数 影响一般 影响很小(性能改善了)
4.查询转换 影响一般 很低,有Cache
5.生成具体的查询字符串 很低,有Cache 很低,有Cache
6.数据库查询 可能会非常高 可能会非常高
*Connection.open() (在某些情况下进行了一定处理,性能提高)
*Command.ExcuteReader()
*DataReader.Read()
7.通过查询的数据库生成实体对象 影响一般 影响一般
8. Connection.Close() 影响一般 影响一般
结论:
从以上两张表可以看出,无论是冷查询,还是热查询,EF5的性能都要比EF4要高。
在冷查询的表现中,EF5比EF4似乎有微弱优势;但是在热查询中,因为EF5在某些步骤中多做了些缓存的处理,所以使得热查询的速率提升了不知道多少倍,这个也就是真正的EF5提升性能的原因所在,希望读者仔细对比表格。查找原因所在。
所以说,这次EF5的性能提升,主要是针对热查询来的,因为在冷查询中多做了些缓存工作,使得热查询可以很快的执行。我们都知道,经常一个服务器做的是一些重复的查询,这些重复的查询多了,性能的优势在EF5中表现的越出色。
备注:希望分享的知识能够对您有帮助。限于作者水平有限,如果有不对的知识请直接评论指出,谢谢!