SQL Server: Почему перекомпиляция хранимых процедур требуется?

Напоминаниями обычно является 'Запланированная задача' в Windows XP.

Нажмите на 'Start', затем 'Все Программы', затем 'Аксессуары', затем 'Системные Инструменты' затем 'Запланированные задачи'. Обычно будет тот там под названием 'AppleSoftwareUpdate'. Можно удалить это задание или альтернативно дважды щелкнуть по нему для изменения расписания, к которому оно работает.

3
задан 7 August 2009 в 12:35
3 ответа

От Microsoft:

"Поскольку база данных изменяется такими действиями как добавление индексов или изменение данных в индексированных столбцах, планы исходного запроса, используемые для доступа к его таблицам, должны быть оптимизированы снова путем перекомпиляции их. Эта оптимизация происходит автоматически в первый раз, когда хранимая процедура выполняется после того, как Microsoft SQL Server перезапущен. Также происходит, изменяется ли базовая таблица, используемая хранимой процедурой. Но если новый индекс добавляется, из которого могла бы извлечь выгоду хранимая процедура, оптимизации не происходит до следующего раза выполняется хранимая процедура после того, как Microsoft SQL Server перезапущен. В этой ситуации может быть полезно вынудить хранимую процедуру перекомпилировать в следующий раз, когда это выполняется

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

9
ответ дан 3 December 2019 в 04:56

Полагайте, что использование компиляции слова отличается по SQL Server, чем это, по говорят, нормальное приложение. В нормальном приложении код компилируется в состояние готовности машинного языка, таким образом, он не должен быть интерпретирован во время выполнения. Использование SQL Server компиляции должно определить лучший план выполнения для выполнения запроса. Так как данные имеют потенциал для постоянного изменения, SQL Server, вероятно, придется сделать новые определения на основе индексов, которые доступны, качество статистики, и т.д., и всех, что они могут влиять на план выполнения. В результате каждый раз, когда хранимая процедура выполняется, SQL Server делает определение, чтобы видеть, может ли это снова использовать exisiting план выполнения относительно того запроса или если это должно генерировать новый. Конечно, если никакой план не будет существовать, то это генерирует новый.

Это, BTW, не очень отличается от того, что делают приложения.NET, если Вы думаете об этом. приложения.NET компилируются в состояние промежуточного языка, но только полностью компилируются по умолчанию во время первого показа.

1
ответ дан 3 December 2019 в 04:56

Когда SP компилируется, его путь выполнения фиксируется. Это не может использовать в своих интересах новые индексы или различные стратегии на основе размеров таблицы. Перекомпиляция позволяет этому переоценивать условия выполнения.

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

0
ответ дан 3 December 2019 в 04:56
  • 1
    Таким образом, Вы подразумеваете, что recompiling+executing будет быстрее для простого SPS? Но что относительно более тяжелых? Они должны быть вручную перекомпилированы время от времени затем? –  Marc 7 August 2009 в 12:43
  • 2
    При принуждении перекомпилировать, прежде чем каждый раз, когда это работает, замедлит выполнение. Не проблема, если SP нечасто называют, но повлияет на высоко используемый SP. Было бы лучше для планирования sp_recompile так, чтобы он только перекомпилировал в следующий раз, когда он выполняется. –  PaulPlum 7 August 2009 в 13:05
  • 3
    хм Просто изменяет мое эмпирическое правило на: Простой SPS не установил КОМПИЛЯЦИИ, сложные ПЕРЕКОМПИЛИРОВАЛИ. И Расписание sp_recompile как часть обслуживания. - маленькое время оценки может привести к лучшей общей производительности от оптимизации - сложный SPS занимает время так или иначе. –  Mesh 7 August 2009 в 13:17

Теги

Похожие вопросы