Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изключително бавно стартиране на EF - 15 минути

Успях да намаля общото начално време, предизвикано от EF 3 пъти с тези трикове:

  1. Актуализирайте рамката до 6.2 и активирайте кеширане на модели :

    публичен клас CachingContextConfiguration:DbConfiguration{публичен CachingContextConfiguration(){SetModelStore(нов DefaultDbModelStore(Directory.GetCurrentDirectory()));}

    }

  2. Извикайте ctx.Database.Initialize() изрично от нова тема, възможно най-рано. Това продължава да отнема 3-4 секунди, но тъй като се случва заедно с други неща, помага много.

  3. Заредете обекти в EF кеша в разумен ред.

Преди това току-що написах Include after Inlude, което се превежда в множество присъединявания. Намерих "основно правило" в някои публикации в блогове, че до два верижни Includes EF се представят доста добре, но всеки следващ забавя всичко масово. Намерих и публикация в блог , което показа EF кеширане:след като даден обект бъде зареден с Include или Load, той автоматично ще бъде поставен в правилното свойство (авторът на блога греши относно обединението на обекти). Така че направих това:

  using (var db = new MyContext())
            {
                db.Fields.Load();
                db.Categories.Include(c => c.MainField).Include(x => x.Fields).Load();
                db.FieldValues.Load();
                return db.Objects.Include(x => x.MainFieldValue.Field).ToArray();
            } 

Това извлича данни 6 пъти по-бързо, отколкото включва от въпроса. Мисля, че след като обектите са предварително заредени, EF машината не извиква база данни за свързани обекти, тя просто ги получава от кеша.

  1. Добавих и това в моя контекстен конструктор:

        Configuration.LazyLoadingEnabled = false;
        Configuration.ProxyCreationEnabled = false;
    

Ефектите от това са едва забележими, но може да играят по-голяма роля върху огромен набор от данни.

Също така гледах това представяне на EF Core от Роуън Милър и аз ще премина към него при следващата версия - в някои случаи е 5-6 пъти по-бърз от EF6.

Надявам се това да помогне на някого




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Запитване на данни чрез обединяване на две таблици в две бази данни на различни сървъри

  2. 7 начина за връщане на всички таблици с чужди ключове в SQL Server

  3. Защо целевата таблица на оператор MERGE не е позволено да има активирани правила?

  4. Получаване на грешка при изпълнение на 50 MB скрипт на SQL Server 2008 R2

  5. Как да активирам MSDTC на SQL Server?