Обратите внимание, что планы SQL Server кэшируются как параметрами SET, так и текстом запроса. То есть, если в Management Studio активны разные параметры SET, вы можете увидеть поведение, отличное от того, что видит приложение.
Чтобы проверить параметры SET для каждого соединения, просмотрите столбцы quoted_identifier, arithabort, ansi_null_dflt_on, ansi_defaults, ansi_warnings, ansi_padding, ansi_nulls и concat_null_yields_null представления динамического управления sys.dm_exec_sessions. Для моей недавней проблемы ADO.NET отключил ARITHABORT, а Management Studio - ON.
Чтобы изменить параметры окна запроса в Management Studio, щелкните правой кнопкой мыши в редакторе запросов и выберите «Параметры запроса» в контекстном меню, затем перейдите на страницу «Дополнительно» для ARITHABORT и CONCAT_NULL_YIELDS_NULL и страницу ANSI для QUOTED_IDENTIFIER и Варианты ANSI. В качестве альтернативы просто выполните необходимые параметры SET в этом окне запроса.
После того, как вы настроили ту же среду, проверьте различия между оценочным планом выполнения и фактическим планом выполнения. Предполагаемый план будет рассчитываться с использованием параметров и статистики, доступных в данный момент, тогда как фактический план будет таким, какой есть в кэше. Скорее всего, планы разные, и вам нужно либо обновить статистику, ориентировать ее в соответствии с более типичными параметрами, принудительно каждый раз перекомпилировать, либо переписать запрос, чтобы сделать его более стабильным. Например, если у вас есть необязательные параметры, попробуйте использовать операторы IF / ELSE, а не пытаться быть умным и сказать «WHERE @param = -1 или Column = @param», что будет вести себя совсем иначе, если @param не указан. Или используйте динамический SQL для построения текста.
Вы должны знать, что статистика лучше, когда первый столбец статистики, то есть первый столбец индекса статистики индекса, является наиболее избирательным и наиболее часто обновляемым. SQL Server создает подробную гистограмму только для первого столбца - до 200 значений из этого столбца с количеством строк в каждом диапазоне. Для других комбинаций столбцов он просто вычисляет среднее значение селективности, количество уникальных комбинаций, деленное на количество выбранных строк. Он также автоматически обновляет статистику только в том случае, если в ведущем столбце произошло достаточное количество изменений . См. http://blogs.technet.com/b/rob/archive/2008/05/16/sql-server-statistics.aspx для получения дополнительной информации об обновлении статистики.