Présentation de l'application forcée d'un plan
L'indicateur de requête USE PLAN permet de forcer l'optimiseur de requête à utiliser un plan de requête spécifique pour une requête. L'indicateur de requête USE PLAN fonctionne par l'acceptation du plan de requête que vous souhaitez utiliser au format XML en tant qu'argument. USE PLAN peut être utilisé pour les requêtes dont les plans ralentissent le temps d'exécution et pour lesquelles vous savez qu'il existe de meilleurs plans. Vous y faites généralement appel lorsque des requêtes qui s'exécutaient très bien dans une version antérieure de SQL Server, s'exécutent mal dans une version mise à niveau, qu'il s'agisse d'un service pack ou d'une mise à niveau complète de la version. La plupart du temps, une mise à niveau améliore les délais d'exécution des requêtes, ou du moins ne les change pas, mais il peut y avoir quelques exceptions. L'indicateur de requête USE PLAN aide à gérer les cas où un plan de requête sélectionné par l'optimiseur de requête d'une version antérieure du produit s'avère préférable à celui qui est sélectionné après la mise à niveau.
L'indicateur de requête USE PLAN peut être utilisé avec les repères de plan pour remédier aux performances médiocres des requêtes dans les applications déployées. Les repères de plan servent à appliquer les indicateurs de requête aux requêtes lorsque vous ne pouvez pas, ou ne souhaitez pas, modifier directement l'application. Pour plus d'informations sur les repères de plan, consultez Optimisation des requêtes dans les applications déployées à l'aide des repères de plan. Pour prendre connaissance de scénarios plus détaillés qui expliquent comment appliquer l'indicateur de plan USE PLAN dans les repères de plan, consultez Exemple d'application forcée d'un plan : Créer un repère de plan qui spécifie un plan de requête et Exemple d'application forcée d'un plan : Création d'un repère de plan pour forcer l'application d'un plan obtenu par la réécriture d'une requête.
L'application forcée d'un plan peut intervenir avec la plupart des types de requêtes. Ces requêtes peuvent notamment porter sur des tables, des index cluster et non-cluster, des vues indexées, des tables et des index partitionnés. USE PLAN peut être spécifié avec les instructions de langage de manipulation de données (DML) INSERT, UPDATE, MERGE ou DELETE. Notez que les modifications apportées au schéma de la base de données, telles que l'ajout ou la suppression d'un index, peuvent invalider le plan spécifié dans l'indicateur USE PLAN. Lorsque l'indicateur USE PLAN est spécifié directement dans une requête, un plan non valide provoque l'échec de la requête. Lorsque l'indicateur USE PLAN est spécifié dans un repère de plan, un plan non valide n'entraîne pas l'échec d'une requête ; toutefois, le plan est compilé sans utiliser l'indicateur et peut ne pas être le meilleur choix. Lorsque l'indicateur USE PLAN est utilisé au sein d'un repère de plan, vous pouvez utiliser la fonction sys.fn_validate_plan_guide pour vérifier la validité du plan. Selon les résultats de la fonction, vous pouvez décider de supprimer le repère de plan et de paramétrer de nouveau la requête, ou de modifier la conception de base de données. Par exemple, vous pouvez recréer l'index spécifié dans le repère de plan.
Les plans de requête générés avec l'indicateur de requête USE PLAN sont mis en cache comme tout autre plan de requête.
Limites de l'application forcée d'un plan
L'application forcée d'un plan impose à une requête un seul plan d'exécution statique. L'application forcée d'un plan empêche l'optimiseur de requête de s'adapter à la modification des tailles et des distributions des données, aux nouveaux index et à d'autres variables. Utilisée à mauvais escient, l'application forcée d'un plan peut par conséquent nuire aux performances. N'utilisez l'application forcée d'un plan qu'après avoir passé en revue toutes les autres possibilités d'amélioration des performances d'une requête, comme l'utilisation de statistiques actualisées et précises, ou d'index optimisés. L'application forcée d'un plan doit être utilisée avec parcimonie et uniquement par des administrateurs de base de données et des développeurs expérimentés, parfaitement au fait des problèmes de performance et de l'environnement de leur base de données et des applications.
Lorsque vous utilisez l'indicateur de requête USE PLAN pour influencer la compilation d'une requête dans une application déployée, il est préférable que cet indicateur soit à l'intérieur d'un repère de plan plutôt que directement imbriqué dans l'application. Ce faisant, vous pouvez déjouer les pièges suivants :
Vous pouvez modifier ou retirer l'indicateur sans modifier ou recompiler l'application. Il arrive, dans certains cas, que l'indicateur USE PLAN, qui s'appliquait dans une version de SQL Server, ne s'applique pas dans un service pack ou une version ultérieure. Par conséquent, il vous faudra peut-être modifier ou supprimer un indicateur USE PLAN après le déploiement d'une application.
Mieux vaut éviter d'utiliser un indicateur de grande taille dans la requête. Cette dernière est plus facile à lire.
Important
En cas de création d'un repère de plan utilisant USE PLAN, il vous faut vérifier, au cours du test, que la requête dont vous souhaitez forcer l'application du plan est le plus souvent soumise avec une demande de curseur. Les plans de requête des requêtes curseur diffèrent de ceux utilisés avec des requêtes non-curseur. Par conséquent, pour créer un repère de plan spécifiant un indicateur USE PLAN qui s'applique à une requête soumise avec une demande de curseur, il faut que le repère de plan spécifie un plan de curseur. Pour plus d'informations, consultez Utilisation de l'indicateur de requête USE PLAN sur les requêtes avec curseurs.
L'application forcée d'un plan n'est pas prise en charge pour les types de requêtes suivants :
Requêtes avec curseurs dynamiques, curseurs pilotés par jeu de clés et curseurs avant uniquement. Les curseurs statiques et avance rapide uniquement sont pris en charge. Pour plus d'informations, consultez Utilisation de l'indicateur de requête USE PLAN sur les requêtes avec curseurs.
Requêtes distribuées.
Requêtes de texte intégral.
Voir aussi