Я сталкиваюсь с некоторыми серьезными проблемами производительности с простыми 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 ), но этого не произошло. иметь какой-либо эффект.
Это оставляет мне несколько вопросов:
Дополнительная информация:
Я должен также упомянуть, что если я перезапущу SQL Server Служба через консоль управления службами ПОСЛЕ включения флага трассировки 4136 с помощью приведенного ниже сценария, похоже, фактически очищает флаг трассировки ... возможно, мне следует сделать это по-другому ...
DBCC TRACEON(4136,-1)