Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de données SQL dans Microsoft Fabric
Important
Les indicateurs du Magasin des requêtes fournissent une méthode plus facile à utiliser pour mettre en forme les plans de requête sans changer le code de l’application. Les indications de requête de Magasin des requêtes sont plus simples que les guides de plan. Les indicateurs du Magasin des requêtes sont disponibles dans Azure SQL Database, SQL Database dans Microsoft Fabric, Azure SQL Managed Instance et dans SQL Server 2022 (16.x) et versions ultérieures.
Les repères de plan vous permettent d’optimiser les performances des requêtes lorsque vous ne pouvez pas ou ne souhaitez pas modifier directement le texte de la requête réelle dans SQL Server. Les repères de plan influencent l'optimisation des requêtes en attachant des indicateurs de requête ou un plan fixe de requête à celles-ci. Les repères de plan s'avèrent utiles lorsqu'un petit sous-ensemble de requêtes d'une application de base de données fournie par un tiers ne fonctionne pas comme prévu. Dans le repère de plan, vous spécifiez l'instruction Transact-SQL que vous voulez optimiser et une clause OPTION contenant les indicateurs de requête ou un plan de requête spécifique à utiliser pour optimiser la requête. Lorsque la requête s’exécute, SQL Server fait correspondre l’instruction Transact-SQL au repère de plan et attache la clause OPTION à la requête au moment de l’exécution ou fait appel au plan de requête spécifié. Comme l’optimiseur de requête SQL Server sélectionne généralement le meilleur plan d’exécution pour une requête, nous recommandons de ne recourir aux repères de plan qu’en dernier ressort, et à condition d’être un développeur ou un administrateur de base de données expérimenté.
Le nombre total de repères de plan que vous pouvez créer est uniquement tributaire des ressources système disponibles. Toutefois, les repères de plan doivent se limiter au traitement des requêtes critiques ciblées à des fins d'amélioration ou de stabilisation des performances. Les guides de plan ne doivent pas être utilisés pour influencer l’essentiel de la charge des requêtes d’une application déployée.
Le plan d’exécution obtenu, qui est forcé par cette fonctionnalité, est le même que le plan forcé ou est similaire à celui-ci. Étant donné que le plan obtenu ne peut pas être identique au plan spécifié par le repère de plan, les performances des plans peuvent varier. Dans de rares cas, la perte de performances peut être importante. Dans ce cas, l’administrateur doit supprimer le plan forcé.
Les repères de plan ne peuvent pas être utilisés dans toutes les éditions de Microsoft SQL Server. Pour obtenir la liste des fonctionnalités prises en charge par les éditions de SQL Server, consultez Fonctionnalités prise en charge par les éditions de SQL Server 2016. Les guides de plan sont visibles dans toutes les éditions. En outre, vous pouvez attacher une base de données qui contient des repères de plan à n'importe quelle édition. Les repères de plan restent intacts lorsque vous restaurez ou attachez une base de données à une version mise à niveau de SQL Server.
Types de guides de plan
Il est possible de créer les types de repères de plan suivants.
OBJECT, repère de plan
Un repère de plan OBJECT correspond à des requêtes qui s’exécutent dans le contexte de procédures stockées Transact-SQL, de fonctions scalaires définies par l’utilisateur, de fonctions table à instructions multiples définies par l’utilisateur et de déclencheurs DML.
Supposons que la procédure stockée suivante, qui accepte le paramètre @Country_region, figure dans une application de base de données déployée dans la base de données AdventureWorks2025 :
CREATE PROCEDURE Sales.GetSalesOrderByCountry (@Country_region nvarchar(60))
AS
BEGIN
SELECT *
FROM Sales.SalesOrderHeader AS h, Sales.Customer AS c,
Sales.SalesTerritory AS t
WHERE h.CustomerID = c.CustomerID
AND c.TerritoryID = t.TerritoryID
AND CountryRegionCode = @Country_region
END;
Supposons que cette procédure stockée a été compilée et optimisée pour @Country_region = N'AU' (Australie). Toutefois, comme il y a relativement peu de commandes client qui proviennent d’Australie, les performances diminuent lorsque la requête s’exécute à l’aide de valeurs de paramètre de pays/régions contenant plus de commandes client. La plupart des commandes provenant des États-Unis, un plan de requête généré pour @Country_region = N'US' obtiendrait de meilleures performances pour toutes les valeurs possibles du paramètre @Country_region.
Vous pouvez résoudre ce problème en modifiant la procédure stockée pour ajouter l'indicateur de requête OPTIMIZE FOR à la requête. Toutefois, étant donné que la procédure stockée se trouve dans une application déployée, vous ne pouvez pas modifier directement le code de cette dernière. Vous pouvez en revanche créer le repère de plan suivant dans la base de données AdventureWorks2025 .
sp_create_plan_guide
@name = N'Guide1',
@stmt = N'SELECT *FROM Sales.SalesOrderHeader AS h,
Sales.Customer AS c,
Sales.SalesTerritory AS t
WHERE h.CustomerID = c.CustomerID
AND c.TerritoryID = t.TerritoryID
AND CountryRegionCode = @Country_region',
@type = N'OBJECT',
@module_or_batch = N'Sales.GetSalesOrderByCountry',
@params = NULL,
@hints = N'OPTION (OPTIMIZE FOR (@Country_region = N''US''))';
Lorsque la requête spécifiée dans l'instruction sp_create_plan_guide s'exécute, elle est modifiée avant l'optimisation de façon à inclure la clause OPTIMIZE FOR (@Country = N''US'') .
Guide de plan SQL
Un guide de plan SQL correspond aux requêtes qui s’exécutent dans le contexte d’instructions Transact-SQL autonomes et de lots qui ne font pas partie d’un objet de base de données. Les guides de plan SQL peuvent également être utilisés pour faire correspondre des requêtes qui se paramètrent selon une forme spécifiée. Les repères de plan SQL s’appliquent aux instructions et aux lots Transact-SQL autonomes. Le plus souvent, ces instructions sont envoyées par une application à l’aide de la procédure stockée système sp_executesql . Considérez par exemple le lot autonome suivant :
SELECT TOP 1 * FROM Sales.SalesOrderHeader ORDER BY OrderDate DESC;
Pour empêcher la génération d'un plan d'exécution parallèle sur cette requête, créez le repère de plan suivant et affectez à l'indicateur de requête MAXDOP la valeur 1 dans le paramètre @hints .
sp_create_plan_guide
@name = N'Guide2',
@stmt = N'SELECT TOP 1 * FROM Sales.SalesOrderHeader ORDER BY OrderDate DESC',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (MAXDOP 1)';
Imaginons un autre exemple, où l’instruction SQL suivante est envoyée à l’aide de sp_executesql.
exec sp_executesql N'SELECT * FROM Sales.SalesOrderHeader
where SalesOrderID = @so_id', N'@so_id int', @so_id = 43662;
Pour créer un plan unique pour chaque exécution de cette requête, créez le repère de plan suivant et utilisez l’indicateur de requête OPTION (RECOMPILE) dans le paramètre @hints.
exec sp_create_plan_guide
@name = N'PlanGuide1_SalesOrders',
@stmt = N'SELECT * FROM Sales.SalesOrderHeader
where SalesOrderID = @so_id',
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@so_id int',
@hints = N'OPTION (recompile)';
Important
Les valeurs fournies pour les arguments @module_or_batch et @params de l'instruction sp_create_plan guide doivent correspondre au texte correspondant soumis dans la requête réelle. Pour plus d’informations, consultez sp_create_plan_guide (Transact-SQL) et Utiliser SQL Server Profiler pour créer et tester des repères de plan.
Les guides de plan SQL peuvent également être créés sur des requêtes qui sont paramétrées sous la même forme lorsque l’option de base de données PARAMETERIZATION est définie sur SET FORCED, ou lorsqu’un guide de plan TEMPLATE est créé qui spécifie cette classe paramétrée de requêtes.
guide du plan TEMPLATE
Un guide de plan TEMPLATE correspond à des requêtes autonomes qui se paramètrent selon une forme spécifiée. Il s'emploie pour remplacer l'option SET de base de données PARAMETERIZATION par une classe de requêtes.
Vous pouvez créer un guide de plan TEMPLATE dans l’un des cas suivants :
Quand l’option de base de données PARAMETERIZATION est SET sur la valeur FORCED, mais qu’il y a des requêtes que vous voulez compiler selon les règles du paramétrage simple
L’option de base de données PARAMETERIZATION est SET simple (paramètre par défaut), mais vous souhaitez que le paramétrage forcé soit essayé sur une classe de requêtes.
Exigences de correspondance du guide de plan
Les repères de plan sont limités à la base de données dans laquelle ils sont créés. Par conséquent, seuls les repères de plan existant dans la base de données qui est active lors de l'exécution d'une requête peuvent être mis en correspondance avec cette requête. Supposons que AdventureWorks2025 est la base de données active et que la requête suivante est exécutée :
SELECT FirstName, LastName FROM Person.Person;
Seuls les repères de plan de la base de données AdventureWorks2025 peuvent être mis en correspondance avec cette requête. Supposons maintenant que AdventureWorks2025 est la base de données active et que les instructions suivantes sont exécutées :
USE DB1;
SELECT FirstName, LastName FROM Person.Person;
Seuls les repères de plan de DB1 peuvent être mis en correspondance avec la requête, car celle-ci s'exécute dans le contexte de DB1.
Pour les repères de plan basés sur SQL ou TEMPLATE, SQL Server fait correspondre les valeurs des arguments @module_or_batch et @params avec une requête en comparant les deux valeurs caractère par caractère. Cela signifie que vous devez fournir le texte exactement tel que SQL Server le reçoit dans le traitement réel.
Quand @type = ’SQL’ et @module_or_batch est défini sur NULL, la valeur de @module_or_batch est définie sur la valeur de @stmt. Cela signifie que la valeur de statement_text doit être fournie dans le format identique, caractère pour caractère, tel qu’il est soumis à SQL Server. Aucune conversion interne n'est effectuée afin de permettre cette correspondance.
Lorsqu'un repère de plan normal (SQL ou OBJECT) et un repère de plan TEMPLATE peuvent s'appliquer tous les deux à une instruction, seul le repère de plan normal est utilisé.
Note
Le lot qui contient l’instruction sur laquelle vous souhaitez créer un guide de plan ne peut pas contenir d’instruction USE database.
Effet du guide de plan sur le cache des plans
La création d'un repère de plan sur un module supprime le plan de requête pour ce module du cache du plan. La création d'un repère de plan de type OBJET ou SQL sur un lot supprime le plan de requête pour un lot qui a la même valeur de hachage. La création d'un repère de plan de type TEMPLATE supprime tous les lots comprenant une instruction unique du cache du plan dans cette base de données.
Tâches associées
| Task | Topic |
|---|---|
| Explique comment créer un guide de plan. | Créer un nouveau guide de plan |
| Explique comment créer un repère de plan pour les requêtes paramétrables. | Créer un repère de plan pour les requêtes paramétrables |
| Explique comment contrôler le comportement de la paramétrisation des requêtes à l’aide de guides de plan. | Spécifier le comportement du paramétrage des requêtes à l’aide de guides de plan |
| Explique comment inclure un plan de requête figé dans un guide de plan. | Appliquer un plan de requête fixe à un guide de plan |
| Explique comment spécifier des indications de requête dans un guide de plan. | Associer des indications de requête à un guide de plan |
| Explique comment afficher les propriétés d’un guide de plan. | Afficher les propriétés du repère de plan |
| Explique comment utiliser SQL Server Profiler pour créer et tester des guides de plan. | Utiliser SQL Server Profiler pour créer et tester des repères de plan |
| Explique comment valider des guides de plan. | Valider des repères de plan après la mise à niveau |
Voir aussi
sp_create_plan_guide (Transact-SQL)
sp_create_plan_guide_from_handle (Transact-SQL)
sp_control_plan_guide (Transact-SQL)
sys.plan_guides (Transact-SQL)
sys.fn_validate_plan_guide (Transact-SQL)