2015-07-17 2 views
0

У меня есть запрос EF 6, в котором содержится около 6 ссылок на linq join. Когда я просматриваю свой код с помощью отладчика, я вижу, что для выполнения запроса требуется примерно 6 секунд. С помощью SQL-трассировки я могу сказать, что фактический запрос, который выглядит так, как я ожидал, займет 0 мс и возвращает 0 строк. Я удалил заявления объединения 1 на один. При удалении каждой операции объединения оператор EF занимает 1 секунду меньше, чтобы выполнить. Выбранная часть запроса никогда не менялась, а только количество объединений.Почему платформа Entity Framework настолько медленна с заявлениями о соединении?

Мой вопрос: что происходит? Что такое EF, для этого требуется столько времени для обработки этого запроса? Как ни странно, похоже, что большая часть этого времени фактически потрачена после завершения выполнения SQL, поэтому время не генерирует запрос, но независимо от того, что делает EF после этого.

+1

Запустите профайлер SQL и посмотрите, что EF работает против SQL при запуске сложного запроса из вашего DbContext. Затем, как только вы перестали плакать, упростите свои запросы. – Matt

+0

Сердечно рекомендую отличную презентацию Джимми Богарда о том, как Do и Don'ts используют ORM >> https://github.com/jbogard/presentations/blob/master/ORMs/Orms.pptx – Matt

+0

Как я уже говорил в своем оригинальном посте. Я выполнил трассировку SQL. У меня нет проблемы с тем, что производит EF. SQL выполняется в 0 мс, поэтому я не понимаю, почему строка кода занимает 6 секунд. – Eric

ответ

0

Вы используете ленивую загрузку и инициализацию каждого соединения отдельно? Если вы вызываете 6 объединений на 6 больших наборах данных, которые возвращают объекты с приличным размером, это будет медленным. Вероятно, это займет много времени, потому что набор данных, который вы возвращаете, может быть очень большим, и вы делаете это 6 раз. У меня была эта проблема с огромными наборами данных и таблицами на веб-страницах, которые фильтруются с помощью ajax. Я смог улучшить производительность, используя ленивую загрузку и объединяя все свои запросы, а затем только инициализируя ее. Я предполагаю, что в конце концов после 6 объединений вы хотите, чтобы один набор данных состоял из всех этих объединений. Вы хотите объединить эти объединения в один запрос и только один раз запустить его по вашей БД, поэтому EF должен только один раз создать объекты в вашем коде.

+0

Нет, я посмотрел на SQL, созданный, чтобы убедиться. Он испускает один оператор SQL с 6 соединениями. Этот запрос возвращает 0 строк. – Eric