sys.fn_validate_plan_guide (Transact-SQL)

Vérifie la validité du repère de plan spécifié. La fonction sys.fn_validate_plan_guide retourne le premier message d'erreur rencontré lorsque le repère de plan est appliqué à sa requête. Un ensemble de lignes vide est retourné lorsque le repère de plan est valide. Les repères de plan peuvent devenir non valides lorsque des modifications sont apportées à la conception physique de la base de données. Par exemple, si un repère de plan spécifie un index particulier et que cet index est ensuite supprimé, la requête ne peut plus utiliser ce repère de plan.

En validant un repère de plan, vous pouvez déterminer si le repère peut être utilisé par l'optimiseur sans modification. Selon les résultats de la fonction, vous pouvez décider de supprimer le repère de plan et paramétrer à nouveau la requête, ou de modifier la conception de base de données, par exemple, en recréant l'index spécifié dans le repère de plan.

Icône Lien de rubriqueConventions de syntaxe Transact-SQL

Syntaxe

sys.fn_validate_plan_guide ( plan_guide_id )

Arguments

  • plan_guide_id
    ID du repère de plan tel qu'indiqué dans l'affichage catalogue sys.plan_guides. plan_guide_id est int sans valeur par défaut.

Table retournée

Nom de la colonne

Type de données

Description

msgnum

int

ID du message d'erreur.

severity

tinyint

Niveau de gravité du message, entre 1 et 25.

state

smallint

Numéro d'état de l'erreur indiquant le point dans le code au niveau duquel l'erreur s'est produite.

message

nvarchar(2048)

Texte du message de l'erreur.

Autorisations

Les repères de plan de portée OBJECT requièrent une autorisation VIEW DEFINITION ou ALTER sur l'objet et les autorisations référencés pour compiler la requête ou le lot fourni dans le repère de plan. Par exemple, si un lot contient des instructions SELECT, des autorisations SELECT sont requises sur les objets référencés.

Les repères de plan de portée SQL ou TEMPLATE requièrent une autorisation ALTER sur la base de données et les autorisations pour compiler la requête ou le lot fourni dans le repère de plan. Par exemple, si un lot contient des instructions SELECT, des autorisations SELECT sont requises sur les objets référencés.

Exemples

A. Validation de tous les repères de plan dans une base de données

L'exemple suivant vérifie la validité de tous les repères de plan dans la base de données actuelle. Si un jeu de résultats vide est retourné, tous les repères de plan sont valides.

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

B. Test de la validation des repères de plan avant d'implémenter une modification à la base de données

L'exemple suivant utilise une transaction explicite pour supprimer un index. La fonction sys.fn_validate_plan_guide est exécutée pour déterminer si cette action invalidera des repères de plan dans la base de données. En fonction des résultats de la fonction, l'instruction DROP INDEX est validée ou la transaction est restaurée, et l'index n'est pas supprimé.

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