淺析EF效能優化
1.資料Load
延遲載入:當實體第一次讀取時,相關資料沒有載入;當第一次試圖訪問導航屬性時,所需的導航資料自動載入,EF預設使用這種方式載入資料,儘量使用預先載入和顯示載入。
優點:載入資料快
缺點:資料庫互動多次
預先載入:當讀取實體時,相關資料同時讀取。這通常會導致一個連線查詢,查詢所有所需的資料,使用Include方法指定預先載入。
優點: 資料庫互動少
缺點:載入實體多,資料量大時,變慢,會有很多冗餘欄位
顯示載入:這種載入方式類似於延遲載入,不同的是我們要在程式碼中明確地查詢相關資料,導航屬性是手動控制的,需要呼叫Collection.Load
方法獲取集合,呼叫Reference.Load
方法獲取單個實體來載入相關資料。
優點: 載入資料快,導航屬性如何載入可以自己控制,通常關聯實體集合的數量被限制時,使用Load
方法
缺點: 需要自己控制,資料庫互動多次,互動次數由自己控制
CompiledQuery
:提供對查詢的編譯和快取以供重新使用。當相同的查詢需要執行很多遍的時候,那麼我們可以使用ComplieQuery
將查詢的語句進行編譯以便下次使用,這樣可以免去對同一語句的多次處理,從而改善效能
優點:減少查詢表示式樹編譯次數
AsNoTracking
:如果資料是隻讀操作,用AsNoTracking取消追蹤,提升效能。
SqlQuery
:對於複雜的查詢或儲存過程的使用,考慮用SqlQuery操作原生sql。
Skip
:分頁在資料庫中分頁,不要再記憶體中分頁,以提升效能
IQueryable
和IEnumerable
:IQueryable
返回的是查詢表示式,也就是說生成了SQL查詢語句但是卻還沒有與資料庫進行互動。IEnumerable
則是已經執行查詢資料庫的操作且資料儲存在了記憶體中,所以在進行條件拼接的時候一定要在IQueryable
型別後面追加Where
條件語句,而不是等到ToList
之後再開始寫條件,以提升效能。
2. 資料Get
Find()
方法:查詢一個實體,不僅查詢資料庫,而且還查詢新新增的沒有儲存到資料庫中的物件。
查詢方式:記憶體查詢->新新增還沒儲存到資料庫中的物件->資料庫中還沒載入到記憶體中實體
優點:根據主鍵查詢,主鍵有索引,速度快
缺點:只能根據主鍵查詢
GetObjectByKey()
方法:查詢一個實體
查詢方式:記憶體查詢- >資料庫中實體
優點:先從記憶體中取速度快
缺點:只能根據主鍵查詢,查詢不到丟擲異常
TryGetObjectByKey()
方法:查詢一個實體
查詢方式:記憶體查詢- >資料庫中實體
優點:先從記憶體中取速度快 , 查詢不到返回null
缺點:只能根據主鍵查詢
Single()
方法:查詢一個實體
查詢方式:資料庫中實體
優點:不根據主鍵進行查詢或查詢時載入相關實體
缺點:查詢沒有返回結果或返回的結果多於一個就會丟擲異常
SingleOrDefault()
方法:查詢一個實體
查詢方式:資料庫中實體
優點:不根據主鍵進行查詢或查詢時載入相關實體, 查詢沒有返回結果返回null
缺點:返回的結果多於一個就會丟擲異常
First()
方法:查詢一個實體,不關心是否有多個結果,僅僅取得第一條
查詢方式:資料庫中實體
優點:不根據主鍵進行查詢或查詢時載入相關實體, 只取第一條
缺點:查詢沒有結果就會丟擲異常
FirstOrDefault()
方法:查詢一個實體,不關心是否有多個結果,僅僅取得第一條
查詢方式:資料庫中實體
優點:不根據主鍵進行查詢或查詢時載入相關實體, 只取第一條,查詢沒有結果返回null
缺點:不知道是否有多條資料
3.其它優化
事物的簡短性:儘量把查詢語句和影響事物的語句放在事物外面執行,防止資源死鎖。
批量修改:儘量用sql
執行
預生成檢視:在實體框架可以針對概念模型執行查詢或將更改儲存到資料來源之前,它必須生成一組本地查詢檢視才能訪問資料庫。 由於生成這些檢視會產生很高的成本,因此,您可以在設計時預生成檢視並將它們新增到專案。預生成檢視方式參考:
https://msdn.microsoft.com/zh-cn/library/bb896240.aspx
AsEnumerable()
和ToList()
:兩者都是延遲執行sql
,區別是AsEnumerable()
在執行過濾之前,先將所有資料放到記憶體中,再進行篩選;ToList()
則是先拼接成sql
再請求資料庫,然後結果放入記憶體,是真正的篩選資料。
IQueryable
和IEnumberable
:IQueryable
實現了IEnumberable
介面,IEnumerable<T>
泛型類在呼叫自己的SKip
和 Take
等擴充套件方法之前資料就已經載入在本地記憶體裡了,IEnumerable
跑的是Linq to Object
,強制從資料庫中讀取所有資料到記憶體先,而IQueryable<T>
是將Skip
,Take
這些方法表示式翻譯成T-SQL
語句之後再向SQL
伺服器傳送命令,它並不是把所有資料都載入到記憶體裡來才進行條件過濾。
備註:以上內容僅供參考,是EF效能優化很淺的一部分,如有錯誤大家可以一起討論。
相關文章
- js效能優化淺析JS優化
- iOS 介面效能優化淺析iOS優化
- EF效能優化優化
- Kotlin 效能優化利器 —— Sqeuence 原理淺析Kotlin優化
- [譯] React效能優化-虛擬Dom原理淺析React優化
- 效能優化,實踐淺談優化
- 淺談小程式效能優化優化
- 淺談網站效能之前端效能優化網站前端優化
- 淺談JavaScript程式碼效能優化JavaScript優化
- 淺談webpack4.0 效能優化Web優化
- MySQL效能最佳化淺析及線上案例MySql
- 淺談JavaScript程式碼效能優化2JavaScript優化
- Flutter 高效能原理淺析Flutter
- 高效能IO模型淺析模型
- apache-淺析apache優化的幾點建議Apache優化
- 淺析MySQL語句優化中的explain引數MySql優化AI
- 【前端效能優化】vue效能優化前端優化Vue
- 淺析Android外掛化Android
- 淺談Nginx效能調優Nginx
- 淺談網頁基本效能優化規則小結網頁優化
- OpenAI的結構化淺析OpenAI
- 淺析“程式碼視覺化”視覺化
- JavaScript模組化原理淺析JavaScript
- 模組化開發淺析
- 淺析前端的模組化前端
- 淺析每日使用代理IP的優勢
- 淺析GoogleChrome2.0瀏覽器安全效能GoChrome瀏覽器
- 效能優化優化
- 效能測試中伺服器關鍵效能指標淺析伺服器指標
- iOS元件化通用工具淺析iOS元件化
- 前端效能優化(JS/CSS優化,SEO優化)前端優化JSCSS
- 社群文章|MOSN 社群效能分析利器——Holmes 原理淺析
- Android效能優化——效能優化的難題總結Android優化
- 淺析地面投影的使用原理以及優點
- IPAM功能優勢淺析(中科三方)
- 淺析靜態IP的用途和優點
- 優秀開源庫SDWebImage原始碼淺析Web原始碼
- Android 效能優化 ---- 啟動優化Android優化