Я сталкиваюсь с некоторыми серьезными проблемами с производительностью при использовании простых SQL-запросов, генерируемых Entity Framework (4.2), работающих на SQL Server 2008 R2.В некоторых ситуациях (но не во всех) EF использует следующий синтаксис:
exec sp_executesql 'DYNAMIC-SQL-QUERY-HERE', @param1...
В других ситуациях просто выполняет необработанный SQL с предоставленными параметрами, запеченными в запросе.Проблема, с которой я сталкиваюсь, заключается в том, что запросы, выполняемые с помощью sp_executesql, игнорируют все индексы в моих целевых таблицах, что приводит к чрезвычайно низкому уровню выполнения запроса (подтвержденного проверкой плана выполнения в SSMS).
Через некоторое времяПохоже, что проблема может быть вызвана «анализом параметров».Если я добавлю подсказку запроса OPTION (RECOMPILE) следующим образом:
exec sp_executesql 'DYNAMIC-SQL-QUERY-HERE OPTION(RECOMPILE)', @param1...
Используются индексы на целевых таблицах, и запрос выполняется очень быстро.Я также пытался включить флаг трассировки, используемый для отключения сниффинга параметров (4136) в экземпляре базы данных (http://support.microsoft.com/kb/980653),, однако это не оказало никакого влияния.
Это оставляет меняс несколькими вопросами:
- Есть ли в любом случае добавить подсказку запроса OPTION (RECOMPILE) к SQL, сгенерированному Entity Framework?
- Есть ли в любом случае запретить Entity Framework использовать execsp_executesql, а вместо этого просто запустить сырой SQL?
- Кто-нибудь еще сталкивался с этой проблемой? Любые другие советы / подсказки?
Дополнительная информация:
- Я перезапустил экземпляр базы данных через SSMS, однако я попытаюсь перезапустить службу из консоли управления службами.
- Параметризация установлена на SIMPLE (is_parameterization_forced: 0)
- Оптимизация для рабочих нагрузок adhoc имеет следующие настройки
- значение: 0
- минимум: 0
- максимум: 1
- value_in_use: 0
- is_dynamic: 1
- is_advanced: 1
Следует также упомянуть, что если я перезапущу службу SQL Server через консоль управления службами ПОСЛЕ включенияфлаг трассировки 4136 с приведенным ниже сценарием, по-видимому, фактически очищает флаг трассировки ... возможно, я должен сделать это по-другому ...
DBCC TRACEON(4136,-1)