Как прекомпилировать хранимые процедуры в SQL-сервере?
Доброе утро!
Есть ли способ предварительно скомпилировать хранимые процедуры в SQL Server? Мое требование выглядит следующим образом... У меня есть несколько хранимых процедур, которые занимают больше времени при компиляции, чем при выполнении. Поэтому я хочу предварительно скомпилировать все хранимые процедуры. Было бы неплохо предварительно скомпилировать их, когда сервер БД запущен и работает.
Любые идеи по этому поводу будут очень полезны!
Спасибо и всего наилучшего, Паван.
6 ответов
Вы можете принудительно перекомпилировать, но это не произойдет до следующего запуска
EXEC SP_RECOMPILE YourProcedureName
заставить его перекомпилировать каждый раз при запуске:
СОЗДАЙТЕ ПРОЦЕДУРУ YourProcedureName С РЕКОМЕНДУЕМЫМ.....
заставить его перекомпилировать на этот раз:
EXEC YourProcedureName С RECOMPILE
Вот хорошая статья по оптимизации хранимых процедур SQL Server, чтобы избежать перекомпиляции
РЕДАКТИРОВАТЬ на основе комментариев ОП:
почему бы вам не запустить его вручную (вне приложения) с фиктивными данными (не такими уж фиктивными, что план выполнения плохой, хотя google: sql server подделывает и анализирует параметры сервера) в первый раз, который может вызвать компиляцию, а затем выполнить некоторые sql, чтобы удалить то, что было вставлено. когда пользователи запускают его в первый раз, он уже будет запущен и скомпилирован.
Напишите скрипт, который выполняет каждую хранимую процедуру, используя "SET FMTONLY ON".
Процедура будет скомпилирована, но не будет внесено никаких постоянных изменений в БД во время выполнения. Вы не можете использовать это с процедурами, которые используют временные таблицы (синтаксис #table).
Вот как Microsoft делает это в Visual Studio, чтобы определить, каким должен быть вывод вашей хранимой процедуры.
Если вы используете SQL Server 2008, вы можете использовать Руководство по планированию, чтобы обеспечить повторное использование существующего предварительно скомпилированного плана выполнения.
См. Понимание руководств плана, для получения более подробной информации и, в частности, прочитайте "Руководства плана OBJECT"
Тем не менее, я подозреваю, что источником вашей проблемы является логика процесса, реализуемая в вашей хранимой процедуре, и я бы рекомендовал это в качестве вашей первой точки обзора для настройки производительности.
Можно ли просто выполнить SP один раз, не влияя на какие-либо данные? Если это так, то вы, вероятно, сможете найти способ запустить этот SP при запуске сервера.
Хранимая процедура должна компилироваться (и в этом случае только создавать план запроса), когда она создается и выполняется впервые.
Если вы часто используете WITH RECOMPILE, вам следует остановиться. Если вы делаете это для принудительного пересчета планов запросов, потому что разные параметры работают более эффективно с разными планами запросов (и, если это имеет значение, с точки зрения производительности), то вам нужно рассмотреть возможность создания разных SP для разных планов запросов, возможно, с " родительский "ИП" решает, кому звонить. Но это не безболезненное упражнение.
Если ваши таблицы действительно относятся к категории строк, составляющей менее миллиона, то я бы очень внимательно посмотрел на индексирование и поддержание статистики в актуальном состоянии, периодически перекомпилируя в спокойное время, чтобы обеспечить эффективность планов запросов. Когда вы попадаете в десятки или сотни миллионов строк, может возникнуть необходимость преодолеть боль дублирования.
Редко время компиляции является значительным в эти дни. Вставьте этот код в начало вашей программы и убедитесь, насколько мало времени занимает компиляция.
SET STATISTICS TIME ON
GO
Время компиляции обычно указывается на 0ms
, что означает слишком мал, чтобы беспокоиться, в то время как время выполнения составляет десятки, сотни или даже тысячи миллисекунд.