SQL Server - принудительно НЕ перекомпилировать хранимую процедуру - PullRequest
0 голосов
/ 31 марта 2011

Я хотел бы знать, если существует какая-либо команда, чтобы заставить НЕТ РЕКОМЕНДУЕМ хранимой процедурыУ меня есть процедура, которая займет около 5 минут.Но когда я запускаю прямо в окнах запросов, это занимает всего несколько секунд.У этого sp есть временная таблица.

У меня такой вопрос: есть ли способ заставить хранимую процедуру избежать перекомпиляции ???

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Как отмечалось в комментариях, это почти наверняка не имеет ничего общего с перекомпиляцией плана. Если мне пришлось рискнуть предположить, это связано с неправильным планом запроса, вызванным анализом параметров.

Предположим, у вас есть веб-сайт электронной коммерции, на котором мы можем получать различные продажи. У нас будет гораздо больше адресов в Калифорнии, чем у меня на Аляске, верно? Физические операции, которые SQL Server будет выполнять для чтения большого количества данных (суммарные продажи в Калифорнии), будут сильно отличаться от запросов на считывание небольших данных (суммарные продажи на Аляске). Иногда кэшированные планы хороши только для одного набора параметров и ужасны для всех остальных. Это часто называют анализом параметров.

На сайте Simple Talk есть фантастическая статья о Измерении параметров . Таким образом, вы можете избежать чтения, у вас не так уж много опций, кроме указания OPTION (RECOMPILE) на уровне оператора, указания WITH RECOMPILE на уровне процедуры или копирования параметров процедуры в локальные переменные и их использования для запуска параметризованных параметров. запрос.

0 голосов
/ 24 декабря 2012

Обратите внимание, что планы 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 для получения дополнительной информации об обновлении статистики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...