Как прекомпилировать хранимые процедуры в SQL-сервере? - PullRequest
2 голосов
/ 26 июня 2009

Доброе утро!

Есть ли способ предварительно скомпилировать хранимые процедуры в SQL Server? Мое требование выглядит следующим образом ... У меня есть несколько хранимых процедур, которые занимают больше времени при компиляции, чем при выполнении. Поэтому я хочу предварительно скомпилировать все хранимые процедуры. Было бы неплохо предварительно скомпилировать их, когда сервер БД запущен и работает.

Любые идеи на этот счет были бы очень полезны!

Спасибо и С уважением, Паван.

Ответы [ 6 ]

5 голосов
/ 15 августа 2011

Напишите скрипт, который выполняет каждую хранимую процедуру, используя «SET FMTONLY ON».

Процедура будет скомпилирована, но постоянные изменения в БД не будут вноситься во время выполнения. Вы не можете использовать это с процедурами, которые используют временные таблицы (синтаксис #table).

Вот так Microsoft делает это в Visual Studio, чтобы определить, каким должен быть вывод вашей хранимой процедуры.

2 голосов
/ 26 июня 2009

вы можете принудительно перекомпилировать, но это не произойдет до следующего запуска

EXEC SP_RECOMPILE YourProcedureName

подробнее здесь ...

принудительно перекомпилировать при каждом запуске:
СОЗДАНИЕ ПРОЦЕДУРЫ YourProcedureName С РЕКОМЕНДУЕМЫМ .....

заставить его перекомпилировать на этот раз:
EXEC YourProcedureName С РЕКОМЕНДУЕМЫМ

хорошая статья об оптимизации хранимых процедур SQL Server для избежания перекомпиляции

и еще один ...

РЕДАКТИРОВАТЬ на основе комментариев ОП:

почему бы вам не запустить его вручную (вне приложения) с фиктивными данными (не такими уж фиктивными, что план выполнения плохой, хотя google: sql server подделывает и анализирует параметры сервера) в первый раз, что может вызвать компиляцию, затем запустите SQL, чтобы удалить то, что было вставлено. когда пользователи запускают его в первый раз, он уже будет запущен и скомпилирован.

1 голос
/ 16 ноября 2013

Можно ли выполнить SP один раз, не влияя на какие-либо данные? Если это так, то вы, возможно, сможете найти способ запуска этого SP при запуске сервера.

1 голос
/ 26 июня 2009

Если вы используете SQL Server 2008, то вы можете использовать Руководство по планированию, чтобы обеспечить повторное использование существующего предварительно скомпилированного плана выполнения.

См. Общие сведения о руководствах по планам , для получения более подробной информации и, в частности, прочитайте «Руководства по планам OBJECT»

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

0 голосов
/ 23 января 2015

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

SET STATISTICS TIME ON
GO

Вы найдете, что время компиляции обычно задается как 0ms, что означает, что слишком мало, чтобы беспокоиться, тогда как время выполнения составляет десятки, сотни или даже тысячи миллисекунд.

0 голосов
/ 26 июня 2009

Хранимая процедура должна компилироваться (и в этом случае только создавать план запроса), когда она создается и выполняется впервые.

Если вы часто используете WITH RECOMPILE, вам следует остановиться. Если вы делаете это для принудительного пересчета планов запросов, потому что разные параметры работают более эффективно с разными планами запросов (и, если это имеет значение, с точки зрения производительности), то вам необходимо рассмотреть возможность создания разных SP для разных планов запросов, возможно, с помощью " родительский "ИП" решает, кому звонить. Но это не безболезненное упражнение.

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

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