Сводка: у нас есть проблемы со временем компиляции запроса EF4 12 + секунды. Кэшируемые запросы только получат нас до сих пор; есть ли какие-либо способы, которыми мы можем на самом деле уменьшить время компиляции? Есть ли что-нибудь, что мы могли бы делать неправильно, мы можем искать?Спасибо!
У нас есть модель EF4, которая выставляется по сервисам WCF. Поскольку каждый наш объект вводит, мы выставляем метод, чтобы выбрать и возвратить целый объект для дисплея / редактирование включая многие дочерние объекты, на которые ссылаются.
Для одного конкретного объекта у нас есть к.Include () 31 таблица / подтаблицы для возврата всех соответствующих данных. К сожалению, это делает компиляцию запроса EF непомерно медленной: это занимает 12-15 секунд для компиляции и создает с 7,800 строками, 300K запрос. Это - бэкенд веб-UI, который должен будет быть более мгновенным, чем это.
Есть ли что-нибудь, что мы можем сделать для улучшения этого? Мы можем CompiledQuery. Скомпилируйте это - который не делает никакой работы до первого использования и так помогает второму и последующему выполнению, но наш клиент возбужден, что первое использование не должно быть медленным также. Так же, если пул приложений IIS, размещающий веб-сервис, будет переработан, то мы потеряем кэшируемый план, хотя мы можем увеличить время жизни для уменьшения этого. Также я не вижу способ предварительно скомпилировать это заранее и / или сериализировать EF скомпилированный кэш запроса (за исключением отражательных приемов). CompiledQuery возражают, только содержит ссылку GUID в кэш, таким образом, это - кэш, о котором мы действительно заботимся. (Пишущий это, мне приходит в голову, что я могу начать что-то в фоновом режиме от app_startup для выполнения всех запросов, чтобы скомпилировать их - который безопасен?)
Однако, даже если мы действительно решаем ту проблему, мы создаем наши поисковые запросы динамично с пунктами LINQ к объектам, на основе которых параметров мы ищем на: Я не думаю, что генератор SQL делает достаточно хорошее задание, что мы можем переместить всю эту логику на уровень SQL, таким образом, я не думаю, что мы можем предварительно скомпилировать наши поисковые запросы. Это менее серьезно, потому что поисковые результаты данных используют меньше таблиц и таким образом, это - компиляция только 3-4 секунд не 12-15, но клиент думает, что все еще действительно не будет приемлемо для конечных пользователей.
Таким образом, мы действительно должны уменьшить время компиляции запроса так или иначе. Какие-либо идеи?
Я не понимаю, почему требуется 12-15 секунд для генерации единственного выбора через 32 таблицы, таким образом, я оптимистичен, что существует некоторый объем для улучшения!
Спасибо за любые предложения! Мы выполняем против SQL Server 2008 в случае, если это имеет значение и XP / 7 / сервер 2 008 использований R2 RTM VS2010.
Сделайте ваши запросы проще. Шутки в сторону; существует почти линейная зависимость между сложностью запроса и временем компиляции. Два простых запроса часто намного быстрее, чем один действительно сложный запрос (даже если он предварительно скомпилирован!). Если конечной целью является скорость, выберите самый быстрый вариант.
Вы можете попробовать использовать http://www.iis.net/download/ApplicationWarmup Сейчас он находится в стадии бета-тестирования, но мы также планируем его использовать.
Скорее всего, это не тот ответ, который вы ищете, но для простого обходного пути почему бы вам не запустить CompiledQuery.Compile в момент инициализации webapp (сделать какой-нибудь фиктивный вызов webapp) вместо первого (клиентского) вызова.
Вы можете создать представление для некоторых более сложных запросов, которое дает вам полный контроль над SQL. Затем включить это представление в модель данных.