微軟官方數據說,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中表現的越出色。
備注:希望分享的知識能夠對您有幫助。限於作者水平有限,如果有不對的知識請直接評論指出,謝謝!