ADO.NET 實體框架是否以生成性能不佳的查詢而聞名?
這個問題的靈感來自於發佈到最新 ServerFault 部落格文章的評論:
你們還在使用 LINQ to SQL 嗎?
我知道我可以使用 SQL Server Profiler 和/或方法來查看生成的
ToTraceString
查詢並自己分析它們。但是,我正在尋找具有管理使用 Entity Framework 的應用程序訪問的數據庫的實踐經驗的人的意見。實體框架查詢是性能問題的常見原因嗎?
在這種情況下可以優化 LINQ 查詢還是原始 Transact-SQL 是唯一的解決方案?
個別查詢沒問題
ORM 工具(Entity Framework、Linq、 LLBLGen、NHibernate等)的最大性能“問題”之一併不是執行的單個查詢的性能(大多數只是檢索單個查詢的 CRUD 呼叫)根據主鍵記錄回)。
不正確使用延遲載入 = 性能不佳
這是延遲載入的不正確使用,如果您沒有正確設置預取屬性,您最終可能會對數據庫執行大量執行(可以在一次呼叫數據庫中檢索到的東西,變成 200 個人執行,所有網路和 IO 成本都與它們相關聯)
事實證明,對 ProjectEntity 和 CustomerEntity 對象的每次訪問都會在第一次引用特定項目或實體時導致對伺服器的單獨查詢(如圖所示)。這意味著對於應用程序中的每個項目,將有兩個額外的查詢訪問伺服器,因此如果我顯示 20 個項目,我將額外訪問數據庫 40 次。這對您來說是延遲載入,並且通常在這樣的基於列表的顯示中是一個問題。如果您顯示的每一行都需要一個或多個相關實體,情況可能會更糟。
關鍵是知道你正在訪問什麼
使用 ORM 和自己動手操作之間 的真正區別在於,當您自己編寫程式碼時,您不得不考慮 SQL 應該如何建構,並且您可以輕鬆地進入並針對您要解決的特定場景進行調整。
而在使用 ORM 時,您會受到 ORM 工具提供的選項和自定義的限制,並且許多開發人員只是將其留給 ORM 工具本身(假設/希望它會提出最佳計劃),這就是 ORM 的原因工具被廣泛認為有利於 CRUD,但不適用於更複雜的操作……
***注意:*延遲載入可能是一件非常好的事情,當它被不當使用時,這就是問題……