sys.fn_validate_plan_guide (Transact-SQL)
Проверяет допустимость указанной структуры плана. Функция sys.fn_validate_plan_guide возвращает первое сообщение об ошибке, выдаваемое при применении структуры плана к запросу. Если структура плана допустима, возвращается пустой набор строк. Структуры планов могут стать недопустимыми после внесения изменений в физическую структуру базы данных. Например, если в структуре плана указан конкретный индекс, который впоследствии удаляется, данная структура плана больше не может быть использована для запроса.
С помощью проверки допустимости структуры плана можно определить, возможно ли ее использование оптимизатором без изменения. Основываясь на результатах выполнения функции, можно принять решение об удалении структуры плана и повторной настройке запроса или об изменении структуры базы данных, например с помощью повторного создания индекса, указанного в структуре плана.
Синтаксис
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
См. также