四 為提高entity framework 效能,要注意哪些事情.

來源:互聯網
上載者:User

       我發現現在有不少博友,都反對使用EF架構,說它效能低.其實只要你用的好,效能不是問題,經過測試,它也會接近ado.net的訪問了.

       當然如果對EF不瞭解,隨便亂用,確實會引來效能問題.因為EF的查詢語句都是自己產生的.如果不注意,它會多次查詢資料庫,或用效率不高的語句去查詢.

      下面我就把我們在項目中遇到的問題,現我把他總結出來.以供大家參考.當然還有一些沒有列出來的,希望各網友也一起提供一下,以避免大家少走彎路.

  1. 分頁的時候,盡量在資料庫裡面去分頁.在我實際中的項目,我就發現我同事由於他不瞭解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.注意事務的簡短性.

在使用事務時,我們要盡量把查詢語句或者其他響事務外的語句移在事務外執行.不然讓一個事務的時間太長了,就容易引起資源死結的問題.我上次就最佳化我一個同事的代碼,他代碼裡就把所所有不相關的東西都放在事務裡執行,這樣就造成事務的時間太長,當用壓力測時,馬上就出現資源被鎖的錯誤.

       4.查詢出來的實體,如果不考慮刪除和修改,請用NoTracking

         關於Notracking 的使用方法,請看. http://www.cnblogs.com/LingzhiSun/archive/2011/04/27/EF_Trick4.html

       5.大量刪除和修改,不要用先把實體查詢出來,然後再逐個刪除和修改.這樣會產生大量的語句,效率肯定會低.

對於這個解決方式一是直接用sql語句執行,二是可以用自己寫個擴充方法來操作.雖然有不少人反對這方法.但我個人是傾向於自己寫個擴充方法.這樣,有2個好處.一是給開發人員使用簡單.二是方便管理. 雖然也有網友提出用ObjectStateManager.ChangeObjectState 來實現大量刪除,但我是沒有找到相關的大量刪除方法.而且這個也經常會出異常.

        6.使用已編譯的查詢,雖然到EF5.0, LINQ 查詢是自動緩衝的.但使用編譯查詢會比自動緩衝的效率高.

            使用編譯查詢,請參照http://msdn.microsoft.com/zh-cn/library/bb896297.aspx.

        7.預產生視圖,

          具體操作如下:

http://blogs.msdn.com/b/appfabriccat/archive/2010/08/06/isolating-performance-with-precompiled-pre-generated-views-in-the-entity-framework-4.aspx

        8.還有一點,就是對於複雜的查詢,我們要隨時監控產生的查詢語句.

           畢竟EF產生的語句,往往比我們產生的語句更加複雜,這個時候我們就要考慮是否通過其他方式來提高效能.

         9.更多EF效能最佳化,請參考http://msdn.microsoft.com/zh-cn/library/cc853327.aspx

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.