Поделиться через


sys.fn_validate_plan_guide (Transact-SQL)

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

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

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

sys.fn_validate_plan_guide ( plan_guide_id )

Аргументы

  • plan_guide_id
    Идентификатор структуры плана, содержащийся в представлении каталога sys.plan_guides. Аргумент plan_guide_id имеет тип int и не имеет значения по умолчанию.

Возвращаемые таблицы

Имя столбца

Тип данных

Описание

msgnum

int

Идентификатор сообщения об ошибке.

severity

tinyint

Уровень серьезности сообщения, от 1 до 25.

state

smallint

Номер состояния ошибки, отмеченной точкой в коде, в котором она произошла.

message

nvarchar(2048)

Текст сообщения ошибки.

Разрешения

Для структур планов области OBJECT требуются разрешения VIEW DEFINITION или ALTER на соответствующий объект и разрешения на компиляцию запроса или пакета, представленного в структуре плана. Например, если пакет содержит инструкции SELECT, необходимы разрешения SELECT на соответствующие объекты.

Для структур планов области SQL или TEMPLATE требуются разрешение ALTER на базу данных и разрешения на компиляцию запроса или пакета, представленного в структуре плана. Например, если пакет содержит инструкции SELECT, необходимы разрешения SELECT на соответствующие объекты.

Примеры

А. Проверка допустимости всех структур планов в базе данных

В следующем примере выполняется проверка допустимости всех структур планов в текущей базе данных. Если возвращается пустой набор строк, значит все структуры планов допустимы.

USE AdventureWorks;
GO
SELECT plan_guide_id, msgnum, severity, state, message
FROM sys.plan_guides
CROSS APPLY fn_validate_plan_guide(plan_guide_id);
GO

Б. Тестирование проверки структуры плана перед изменением базы данных

В следующем примере используется явная транзакция для удаления индекса. Функция sys.fn_validate_plan_guide выполняется, чтобы определить, станет ли это действие причиной недопустимости каких-либо структур планов в базе данных. В зависимости от результатов выполнения этой функции инструкция DROP INDEX фиксируется либо выполняется откат транзакции, а индекс не удаляется.

USE AdventureWorks;
GO
BEGIN TRANSACTION;
DROP INDEX IX_SalesOrderHeader_CustomerID ON Sales.SalesOrderHeader;
-- Check for invalid plan guides.
IF EXISTS (SELECT plan_guide_id, msgnum, severity, state, message
           FROM sys.plan_guides
           CROSS APPLY sys.fn_validate_plan_guide(plan_guide_id))
    ROLLBACK TRANSACTION;
ELSE
    COMMIT TRANSACTION;
GO