2011-07-19 16 views
5

W przypadku projektu obejmującego około 350 elementów w modelu encji EDMX, mój zespół przeżywa długie oczekiwanie, gdy nastąpi pierwsze zapytanie i gdy nastąpi pierwsze zapisanie.Jak poprawić wydajność uruchamiania dużego modelu Entity Framework 4.0?

Podczas profilowania prostego przypadku, który uruchamia kilka zapytań i zapisuje, prosty zestaw kroków służący do uruchomienia zapytania i zapisania zajmuje kilka minut.

Pierwsze zapytanie zajmuje 47% czasu ogólnego, tylko wywołanie metody ramowej, która wykonuje zapytanie.

Pierwsze zapisywanie zajmuje 50% całkowitego czasu w System.Data.Objects.ObjectContext.SaveChanges.

Czy są jakieś dobre opcje poprawy wydajności - może to być drenaż czasu rozwoju.

(Gdy system uderza produkcję, jest to denerwujące przy starcie, ale nie jest to problem w trakcie trwającej realizacji)

Odpowiedz

6

Podczas korzystania z kontekstu po raz pierwszy generuje modelu mapowania zdefiniowane w metadanych. Opcją jest pregenerate this model i zawierają pliki wstępnie wygenerowane w aplikacji (ale musisz ją zregenerować za każdym razem, gdy modyfikujesz EDMX).

Taki duży model powinien być prawdopodobnie podzielony na wiele mniejszych modeli. Trudno mi uwierzyć, że 350 podmiotów tworzy pojedynczą domenę, której nie można podzielić.

+0

Dzięki! To działało dobrze. Skończyło się na tym, że użyłem genenowania szablonu T4 powiązanego z artykułem, do którego się odwołałeś. Zmniejszyło to moje początkowe zapytanie do mniej niż 5% pierwotnego czasu, a początkowe oszczędzanie w podobny sposób. Koszt czasu zostaje przesunięty do zapisu EDMX, ale ponieważ jest to operacja rzadsza, znaczny czas rozwoju jest zapisywany podczas uruchamiania debugowania. http://blogs.msdn.com/b/adonet/archive/2008/06/20/how-to-use-a-t4-template-for-view-generation.aspx – BrianCooksey

+0

Twój punkt widzenia na dzielenie modeli jest zrozumiały i docenione. Co ciekawe, poprzednio mieliśmy oddzielne modele, ale doszliśmy do wniosku, że jednolity model złagodzi pewne wyzwania, które wprowadziły oddzielne modele, i że w przypadku tego systemu korzyści przewyższają inne problemy. – BrianCooksey

1

Pojedynczy duży EDMX spowoduje duży ObjectContext. za każdym razem, gdy robisz using(var ctx = new YourObjectContext()), zamierzasz zbudować duży obiekt, zainicjować wiele kolekcji (prawdopodobnie 350 z nich) i to spowoduje, że twoje operacje na bazie danych będą intensywne. Na pewno natrafisz na wyzwania wydajnościowe, gdy osiągniesz duży ruch.

Proponowałbym rozbicie dużego WDMX na mniejsze EDMX i wytworzenie różnych ObjectContextów. Powinieneś umieścić niewielką liczbę logicznie pogrupowanych encji w jednym ObjectContext.

Powiązane problemy