Отсроченное разрешение и компиляция имен

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

При первом выполнении хранимой процедуры обработчик запросов считывает ее текст из представления каталога sys.sql_modules и проверяет существование объектов, на которые ссылается процедура. Этот процесс называется отложенным разрешением имен, поскольку табличные объекты, на которые ссылается хранимая процедура, должны существовать не при создании процедуры, а при ее выполнении.

ms190686.note(ru-ru,SQL.90).gifПримечание.
Отложенное разрешение имен можно использовать только для объектов несуществующих таблиц. Остальные объекты должны существовать при создании хранимой процедуры. Например, при обращении в хранимой процедуре к существующей таблице нельзя ссылаться на несуществующие столбцы.

На этапе разрешения Microsoft SQL Server 2005 выполняет другие проверочные действия (например, проверяет совместимость типов данных столбцов и переменных). Если объекты, на которые ссылается хранимая процедура, отсутствуют, выполнение процедуры останавливается на инструкции, которая обращается к несуществующему объекту. В этом случае (и при обнаружении других ошибок на этапе разрешения) возвращается ошибка.

ms190686.note(ru-ru,SQL.90).gifПримечание.
Если объект, на который ссылается хранимая процедура, удаляется или переименовывается, процедура возвращает ошибку. Однако, если вместо данного объекта создать другой объект с тем же именем, хранимую процедуру можно выполнить, не меняя определение. Например, если хранимая процедура Proc1 ссылается на таблицу Test1, которая будет удалена и заменена другой таблицей с именем Test1, хранимая процедура Proc1 будет ссылаться на новую таблицу. Такую хранимую процедуру не нужно создавать повторно.

Если процедура успешно проходит этап разрешения имен, оптимизатор запросов Microsoft SQL Server анализирует инструкции Transact-SQL в ее теле и создает план выполнения. Этот план выполнения описывает наиболее быстрый способ выполнения хранимой процедуры; при этом учитываются следующие сведения.

  • Количество данных в таблицах.
  • Наличие и типы индексов, построенных по таблицам, и распределение данных в индексируемых столбцах.
  • Операторы сравнения и значения в условиях предложения WHERE.
  • Наличие соединений и ключевых слов UNION, GROUP BY и ORDER BY.

Проанализировав эти факторы, оптимизатор запросов помещает план выполнения в память. Процесс анализа хранимой процедуры и создания плана выполнения называется компиляцией. Оптимизированный план выполнения, который находится в памяти, используется для выполнения запроса. План выполнения остается в памяти до перезапуска SQL Server или до тех пор, пока не потребуется пространство для хранения других объектов.

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

См. также

Основные понятия

Выполнение хранимых процедур (компонент Database Engine)
Создание хранимых процедур (компонент Database Engine)
Создание хранимых процедур CLR
Изменение хранимых процедур
Перекомпиляция хранимых процедур
Просмотр хранимых процедур
Удаление хранимых процедур

Другие ресурсы

CREATE PROCEDURE (Transact-SQL)
sys.sql_modules (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005