Partager via


Mise en correspondance par SQL Server des repères de plan avec les requêtes

SQL Server fait correspondre les repères de plan de type OBJECT aux requêtes qui apparaissent dans la procédure stockée, le déclencheur ou la fonction (module) nommé dans l'argument @module_or_batch de la procédure stockée sp_create_plan_guide. Si un repère de plan existe sur le module, il est mis en correspondance avec la requête spécifiée.

Dans le cas d'une requête soumise dans un traitement, SQL Server met en correspondance les repères de plan avec celle-ci en essayant de faire correspondre la requête à un repère de plan basé sur SQL, de paramétrer la requête, puis en renouvelant l'opération. L'illustration suivante donne un aperçu de ce processus.

Méthode SQL Server de correspondance entre des repères de plan et des requêtes

  1. L'optimiseur de requête SQL Server reconnaît un traitement exécuté en tant que demande de compilation de chaque instruction du traitement.

  2. Pour une instruction spécifique du traitement, SQL Server essaie de faire correspondre l'instruction à un repère de plan basé sur SQL dont l'argument @module_or_batch correspond à celui du texte du traitement entrant, notamment toute valeur littérale de constante, et dont l'argument @stmt correspond également à l'instruction du traitement. Si ce type de repère de plan existe et que la mise en correspondance réussit, le texte de l'instruction est modifié de manière à inclure les indicateurs de requête spécifiés dans le repère de plan. Ensuite, l'instruction est compilée en conséquence.

  3. Si un repère de plan n'est pas mis en correspondance avec l'instruction à l'étape 2, SQL Server essaie de paramétrer l'instruction à l'aide d'un paramétrage forcé. À cette étape, le paramétrage peut échouer pour l'une ou l'autre des raisons suivantes :

    1. L'instruction est déjà paramétrée ou contient des variables locales.

    2. L'option SET de base de données PARAMETERIZATION SIMPLE est appliquée (paramètre par défaut) et il n'existe aucun repère de plan de type TEMPLATE qui s'applique à l'instruction et qui spécifie l'indicateur de requête PARAMETERIZATION FORCED.

    3. Il existe un repère de plan de type TEMPLATE appliqué à l'instruction et spécifiant l'indicateur de requête PARAMETERIZATION SIMPLE.

    Si le paramétrage forcé réussit, SQL Server essaie de faire correspondre la forme paramétrée de l'instruction à un repère de plan de type SQL qui a été créé sur cette instruction paramétrée. Si ce type de repère de plan existe et que la mise en correspondance réussit, le texte de l'instruction est modifié de manière à inclure les indicateurs de requête spécifiés dans le repère de plan. Ensuite, l'instruction est compilée en conséquence. Si aucun repère de plan de ce type n'est mis en correspondance, l'instruction paramétrée est compilée sans être préalablement modifiée par un repère de plan.

  4. Si le paramétrage échoue à l'étape 3, SQL Server essaie de paramétrer l'instruction de nouveau. Cette fois, SQL Server applique le comportement de paramétrage simple par défaut. La requête obtenue est ensuite compilée directement. Les repères de plan ne sont pas mis en correspondance avec les résultats d'un paramétrage simple.

    Notes

    L'indicateur de requête RECOMPILE est ignoré dans les repères de plan de type SQL appliqués à des requêtes paramétrées par le biais d'un paramétrage forcé ou simple. En outre, un avertissement est émis.