Как SQL Server сопоставляет структуры планов запросам
SQL Server сравнивает структуры планов типа OBJECT с запросами, которые находятся внутри хранимой процедуры, триггера или функции (модуля), указанных в аргументе @module_or_batch хранимой процедуры sp_create_plan_guide. Если структура плана существует в модуле, она соответствует заданному запросу.
Для запросов, находящихся в пакетах, SQL Server проводит их сопоставление со структурами планов, пытаясь сначала установить соответствие запроса структуре плана, основанной на SQL, затем параметризовать запрос и снова провести сопоставление. Следующая процедура предоставляет обзор этого процесса.
Оптимизатор запросов SQL Server распознает выполняемый пакет как запрос на компиляцию каждой инструкции в пакете.
Определенной инструкции пакета SQL Server пытается подобрать такую структуру плана SQL, аргумент @module_or_batch которой соответствует аргументу текста входящего пакета (включая значения констант), а аргумент @stmt также соответствует инструкции пакета. Если такая структура плана существует и происходит совпадение, текст запроса изменяется и в него вносятся подсказки, содержащиеся в структуре плана. Затем выполняется компиляция инструкции.
Если структура плана не сопоставлена с инструкцией на шаге 2, SQL Server пытается параметризовать инструкцию, используя принудительную параметризацию. На этом шаге параметризация может завершиться ошибкой по одной из следующих причин.
Инструкция уже параметризована или содержит локальные переменные.
Применен параметр инструкции базы данных SET PARAMETERIZATION SIMPLE (настройка по умолчанию), и не существует структуры плана типа TEMPLATE, которая применяется к запросу и задает подсказку PARAMETERIZATION FORCED.
Существует структура плана типа TEMPLATE, которая применяется к запросу и задает подсказку PARAMETERIZATION SIMPLE.
Если принудительная параметризация проводится успешно, SQL Server пытается сопоставить параметризированную форму инструкции структуре плана типа SQL, который был создан для параметризованной инструкции. Если такая структура плана существует и происходит совпадение, текст запроса изменяется и в него вносятся подсказки, содержащиеся в структуре плана. Затем выполняется компиляция инструкции. Если нет такой сопоставленной структуры плана, параметризованная инструкция компилируется без предварительного изменения структурой плана.
Если на шаге 3 параметризация завершается неудачно, SQL Server снова пытается параметризовать инструкцию. На этот раз SQL Server применяет простую параметризацию, используемую по умолчанию. После чего результирующий запрос компилируется напрямую. Структуры планов не сопоставляются результатам простой параметризации.
Примечание Подсказка RECOMPILE не учитывается для структуры плана типа SQL, которая применяется к запросам, параметризованным при помощи принудительной или простой параметризации. Также возникает предупреждение.
См. также