2009-09-15 3 views
1

С WCF, созданным на основе базы данных, содержащей около 200 таблиц и Entity Framework, требуется много времени (около 2 минут) для входа в систему в первый раз после создания WCF.Метод IQueryable Count занимает больше времени для выполнения

Выполнение кода показало, что метод IQueryable.Count является виновником.

Это происходит только в первый раз после создания кода WCF. Последовательное выполнение метода Count выполняется быстро, как ожидалось.

В чем может быть причина? Являются ли сущности, выполняющие какое-то фоновое кэширование после перестройки кода?

Пожалуйста, поделитесь своими мыслями!

ОБНОВЛЕНО:

@Craig: Спасибо за Pre-Generation взглядов link

Кроме того, это link имеет много предложений по повышению эффективности для EF

Кроме того, проверьте отложенной загрузки для EF library.

ответ

5

Это известная проблема, которая будет resolved with .NET 4.0.

При первом запуске веб-приложения код должен быть кэширован. С этого момента он работает на полной скорости. В статье показаны текущие методы предотвращения этого первоначального замедления путем предварительного запуска кода до того, как ваш первый пользователь попадет в службу.

+0

@TLD: спасибо за ссылку! Я надеюсь, что это устранит связанные с сущностью проблемы, с которыми я столкнулся. – pencilslate

2

Ответ на Lame Duck полезен (проголосован), но он не рассказывает всю историю. При первом выполнении запроса Entity Framework возникает несколько вещей. Одним из них является создание представлений, где SQL скомпилирован для общих запросов, таких как загрузка наборов сущностей и загрузка отдельных объектов. But view generation can also be done at compile time, который спасает первого, несчастливого человека, чтобы выполнить запрос на служебные данные этого этапа. Этот шаг повторяется всякий раз, когда новый ObjectContext инициализируется, поэтому небольшие накладные расходы на создание представления во время компиляции во многом оправдываются во время выполнения. Вторая - это компиляция IQueryable в каноническое дерево команд, которое можно оптимизировать с помощью CompiledQuery. Вы можете столкнуться с одной или двумя из этих проблем, поэтому прежде чем писать это как проблему .NET 3.5 SP 1, стоит проверить их.

Смежные вопросы