powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF6 CodeFirst performance как дальше жить
23 сообщений из 23, страница 1 из 1
EF6 CodeFirst performance как дальше жить
    #39360242
pbda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сгенерировал я тут себе DataContext с 250-ю DbSet-ами по XML-схеме при помощи TT и CodeDom.
После первых тестов выяснилось, что время, затрачиваемое на построение модели составляет примерно 30 секунд, что, граждане - полный ппц для "рекомендуемой Microsoft технологии доступа к данным".
Засел на неделю в библиотеку на предмет поиска путей оптимизации. Интернет нарекомендовал а) натравить ngen на сборки EntityFramework б) разбить DbContext-а на два по 125 сущностей (предметная область это позволяет) в) подключить EF Power Tools или EF Interactive Views для прегенерации г) отключение DbInitializer (синхронизировать базу и модель мне не нужно).
В результате титанических усилий добился уменьшения времени построения модели до 12 секунд

Теперь сижу и размышляю, что с этим недоразумением под названием EF делать.

С одной стороны рукопашное сохранение графа записей через старый добрый SqlCommand инициализируется за миллисекунды и выполняется десятые доли секунды (в тестах на пике до 5000 инсертов/сек), хотя и требует неких усилий на кодогенерацию.
С другой стороны чтение базы, безусловно, удобнее через EF/Linq.
С третьей - 12 секунд.
С четвертой стороны, бытует мнение, что EF это мулька в основном для веба, и что после первой инициализации модели она закешируется в AppDomain и последующие обращения к новому экземпляру DbContext будут происходить мгновенно.
С пятой, клиенты у меня будут преимущественно дескопные.
С благодарностью приму всякие советы и рекомендации по выходу из логического тупика.
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360244
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая версия EF ?
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360245
pbda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
6.1.3
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360283
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pbda6.1.3Та же версия. Наблюдаю 166 таблиц, DbContext API, описано через атрибуты DataAnnotations, миграции отключены. Всё "летает", на "старте" особых замедлений не замечено.
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360290
Var79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pbdaпосле первой инициализации модели она закешируется в AppDomain и последующие обращения к новому экземпляру DbContext будут происходить мгновенно.
так я не понял, у тебя что, не кэшируется или в чем проблема?
первый раз долго, потом быстро, так и должно быть, хоть веб, хоть десктоп.
можно еще другие orm использовать, всякие dapper например.
что бы читать чуть быстрее в EF можно юзать .AsNoTracking()
когда очень надо, что бы писать быстро я использую ADO.NET SqlBulkCopy
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360291
pbda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Летает" - это сколько у вас в секундах/миллисекундах на первую инициализацию модели CodeFirst?

И еще можно поинтересоваться, как в вашей модели с наследованием? У меня в модели около 10 базовых классов, все остальные это наследники (до 5 уровней). Таблицы сформированы по принципу Table-Per-Type, без дискриминатора. Может быть, это как-то влияет? Запросы на select EF-ом порождаются конкретно монструозными.
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360292
pbda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Var79,

а) долго инициализируется при первом вызове б) после инициализации конкретно жрёт память (до гигабайта)
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360296
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pbdaС четвертой стороны, бытует мнение, что EF это мулька в основном для веба,Это пусть каждый сам для себя решает.
pbdaи что после первой инициализации модели она закешируется в AppDomain и последующие обращения к новому экземпляру DbContext будут происходить мгновенно.Да, сначала всё что можно кэшируется, последующие обращения происходят мгновенно.
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360302
Var79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pbda,

да какая разница сколько на первую инициализацию?
в 10 - 20 сек влезает и норм
ведь не только контекст подтормаживает от первой инициализации
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360311
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pbda"Летает" - это сколько у вас в секундах/миллисекундах на первую инициализацию модели CodeFirst?Ну где-то пара секунд, чисто визуально, точно не измерял.
pbdaИ еще можно поинтересоваться, как в вашей модели с наследованием? У меня в модели около 10 базовых классов, все остальные это наследники (до 5 уровней). Таблицы сформированы по принципу Table-Per-Type, без дискриминатора. Может быть, это как-то влияет?Наследованием сущностей из контекста не пользуемся. Может и влияет, не проверял.
pbdaЗапросы на select EF-ом порождаются конкретно монструозными.Главное, что планы выполнения мало отличаются от рукописных. Остальное не важно, ну мне так кажется.
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360314
Var79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pbdaпосле инициализации конкретно жрёт память (до гигабайта)
на всякий случай, в курсе что контекст IDisposable и его нужно брать в using() ?
что именно жрет гигабайт, всё приложение или сколько экземпляров контекста?
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360317
pbda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

Всё-таки похоже, что дело в наследовании. Погуглил EF TPT entity inheritance performance.
https://www.codeproject.com/articles/66313/the-entity-framework-v1-and-v4-deal-breaker-tpt-in.aspx
If you need this type of design, or think that your software at some point in the future will require this type of design, DO NOT use the Entity Framework. The Table-Per-Type inheritance is 100% unusable.
Статья от 2010 года, правда
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360318
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pbdaб) после инициализации конкретно жрёт память (до гигабайта)Это странно, не могут метаданные занимать столько места.
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360321
pbda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Var79,

Знаю и про Disposable и про using.
Память отъедается во время первого обращения к навигационным свойствам наследника DbContext либо при вызове SaveChanges (в этот момент и происходит построение модели в памяти).
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360322
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pbdaСтатья от 2010 года, правдаНо с того времени EF стал намного лучше, просто "как небо и земля". Но всё может быть, я за наследование не подскажу, может ещё кто знает.
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360325
Var79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pbda,

если в память тащить из базы содержимое всех таблиц, то понятно, если прочитал и забыл, то может дело не в контексте, а в том что что то не собирается GC?
WCF сервис с более 100 таблиц с наследованием занимает меньше 300 мб всего.
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360335
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pbdaб) после инициализации конкретно жрёт память (до гигабайта)Может тянутся данные из БД из-за ленивой загрузки?
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360343
pbda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

на SaveChanges тоже память ест.
В общем, всем спасибо, почитал еще и вот это и теперь почти на 100% уверен, что проблема у меня - в наследовании и TPT.
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360491
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pbdaАлексей К,

на SaveChanges тоже память ест.
В общем, всем спасибо, почитал еще и вот это и теперь почти на 100% уверен, что проблема у меня - в наследовании и TPT.
А что если запустить профайлер и посмотреть?
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360739
Gluck_13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Для ускорения поднятия метаданных модели можно использовать Precompiled views. Мы из модели code-first в билд-процессе строим EDMX и вьюхи, все сохраняем в ресурсах сборки. Билд всего этого хозяйства (1300 классов в модели с кучей навигаций между ними) занимает секунд 40, зато в рантайме поднимается за 3 секунды.

2. Запросы к иерархиям TPT, действительно, не самые быстрые. Более того, EF не строит precompiled views для дочерних типов любых иерархий, и первый из запросов к иерархии в рантайме достраивает эти вьюхи в метаданных. Таким образом, если есть способ не делать иерархию - лучше ее не делать. Если есть возможность вместо TPT сделать TPH - лучше сделать так. В отдельных сценариях неплох и TPC.

3. В коде EF действительно есть тормозные места. Мы выявляли их профилированием и правили в исходниках EF. Так, генерацию плана запроса удалось ускорить почти в 2 раза. Также дорабатывали плюшки, например, для использования временных таблиц и динамического SQL в запросах LINQ. Наличие самопального кода, конечно, может потенциально затруднить переход на очередную версию EF, однако MS что-то на EF6 подзабила, а EF7 настолько сырой, что использование его в продакшене пока не представляется возможным. Те же иерархии TPT пока что не реализованы, более того - находятся в самом конце roadmap. Возможность смешивать TPT и TPH в одной иерархии (у нас есть и такое) вообще в EF7 объявлена как deprecated.

PS Кстати, веселое обсуждение issue на гитхабе https://github.com/aspnet/EntityFramework/issues/2266
Здесь представители MS объявили TPT антипаттерном, а разъяренные юзеры таки-продавили включение TPT в roadmap.
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360833
pbda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluck_131. Для ускорения поднятия метаданных модели можно использовать Precompiled views. Мы из модели code-first в билд-процессе строим EDMX и вьюхи, все сохраняем в ресурсах сборки.

Precompiled views это я уже умею. А как из Code First сделать EDMX и какие в нем дополнительные плюшки?

Gluck_132. Запросы к иерархиям TPT, действительно, не самые быстрые. Более того, EF не строит precompiled views для дочерних типов любых иерархий, и первый из запросов к иерархии в рантайме достраивает эти вьюхи в метаданных. Таким образом, если есть способ не делать иерархию - лучше ее не делать. Если есть возможность вместо TPT сделать TPH - лучше сделать так. В отдельных сценариях неплох и TPC.

Если сделать TPH то получится 10 таблиц, в каждой по 200 полей... оставлю на самый крайний случай :)
Сейчас попробую помапить сущности на представления базы данных, которые сводят иерархии в плоские представления. Если дело действительно в наследовании, то это должно сильно улучшить картину.

Gluck_13однако MS что-то на EF6 подзабила, а EF7 настолько сырой, что использование его в продакшене пока не представляется возможным.

Это да. Я от отчаяния даже EF Core успел пощупать. По готовности он примерно как EF7.

Gluck_13PS Кстати, веселое обсуждение issue на гитхабе https://github.com/aspnet/EntityFramework/issues/2266
Здесь представители MS объявили TPT антипаттерном

Спасибо, посмеялся )
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39360960
Var79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pbdaЭто да. Я от отчаяния даже EF Core успел пощупать. По готовности он примерно как EF7.
Эм, так EF Core и EF7 это же одно и тоже, не?

у меня используется TPC
...
Рейтинг: 0 / 0
EF6 CodeFirst performance как дальше жить
    #39394027
ntkrnlmp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pbdaСгенерировал я тут себе DataContext с 250-ю DbSet-ами по XML-схеме при помощи TT и CodeDom.
pbdaEF6 CodeFirst

Вы реально будете использовать все 250 (125) DbSet-ов одновременно?)

Разделите контексты на еще более мелкие и в каждом контексте сделайте свои проекции моделей, которые будут содержать только нужные вам данные. Если вам не нужен трекинг изменений, делайте AsNoTracking() или отключите трекинг изменений в конфигурации. Так же можно запретить создавать прокси типы ваших моделей.

pbdaС одной стороны рукопашное сохранение графа записей через старый добрый SqlCommand инициализируется за миллисекунды и выполняется десятые доли секунды (в тестах на пике до 5000 инсертов/сек), хотя и требует неких усилий на кодогенерацию.
С другой стороны чтение базы, безусловно, удобнее через EF/Linq.

Возможно, в таком случае вам стоит взять тот же Dapper для чтения базы, а для записи использовать "старый добрый SqlCommand" (CQRS).
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF6 CodeFirst performance как дальше жить
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]