Utiliser SQL Server Profiler pour créer et tester des repères de plan
S’applique à : SQL Server Azure SQL Database
Lorsque vous créez un repère de plan, vous pouvez recourir au Générateur de profils SQL pour capturer le texte de requête exact à utiliser dans l’argument statement_text de la procédure stockée sp_create_plan_guide. Ainsi, au moment de la compilation, le repère de plan correspondra à la requête. Une fois le repère de plan créé, vous pouvez également utiliser le Générateur de profils SQL pour tester la correspondance effective du repère de plan à la requête. En règle générale, vous devez tester les repères de plan à l’aide du Générateur de profils SQL pour vérifier que la requête correspond au repère de plan.
Capture de texte de requête à l’aide de SQL Server Profiler
Si vous exécutez une requête et capturez le texte tel qu’il a été soumis à SQL Server à l’aide du Générateur de profils SQL, vous pouvez créer un repère de plan de type SQL ou TEMPLATE qui corresponde exactement à ce texte. Cela permet de faire en sorte que le repère de plan soit utilisé par l'optimiseur de requête.
Imaginons la requête suivante soumise par une application en tant que traitement autonome :
SELECT COUNT(*) AS c
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d
ON h.SalesOrderID = d.SalesOrderID
WHERE h.OrderDate BETWEEN '20000101' and '20050101';
Supposons que vous souhaitiez exécuter cette requête à l'aide d'une opération de jointure de fusion, mais que SHOWPLAN indique qu'elle n'est pas en train d'utiliser une jointure de fusion. Étant donné que vous ne pouvez pas modifier la requête directement dans l'application, vous créez un repère de plan pour spécifier que l'indicateur de requête MERGE JOIN soit ajouté à la requête au moment de la compilation.
Pour capturer le texte de la requête tel que SQL Server le reçoit, procédez comme suit :
Démarrez une trace du Générateur de profils SQL, en veillant à ce que le type d’événement SQL:BatchStarting soit sélectionné.
Faites exécuter la requête par l'application.
Suspendre une trace du générateur de profils SQL
Cliquez sur l'événement SQL:BatchStarting qui correspond à la requête.
Cliquez avec le bouton droit et sélectionnez Extraire les données d’événement.
Important
N'essayez pas de copier le texte du traitement en le sélectionnant dans le volet inférieur de la fenêtre de trace du Générateur de profils. Le repère de plan que vous créez risque alors de ne pas correspondre au traitement d'origine.
Enregistrez les données d'événement dans un fichier. Il s'agit du texte de traitement.
Ouvrez le fichier du texte de traitement dans l'application Bloc-notes puis copiez le texte dans le Presse-papiers.
Créez le repère de plan, puis collez le texte copié entre les guillemets ('') de l’argument @stmt . Vous devez isoler tout guillemet simple contenu dans l'argument @stmt en le faisant précéder par un autre guillemet simple. Faites attention de ne pas ajouter ou supprimer d'autres caractères lorsque vous insérez ces guillemets simples. Par exemple, le littéral de date '20000101' doit être délimité de la façon suivante : ''20000101''.
Voici le repère de plan :
EXEC sp_create_plan_guide
@name = N'MyGuide1',
@stmt = N'<paste the text copied from the batch text file here>',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (MERGE JOIN)';
Test de repères de plan à l’aide de SQL Server Profiler
Pour vérifier qu'un repère de plan correspond à une requête, procédez comme suit :
Démarrez une trace SQL Server Profiler, en veillant à ce que le type d’événement Showplan XML soit sélectionné (situé sous le nœud Performances ).
Faites exécuter la requête par l'application.
Suspendre une trace du générateur de profils SQL
Recherchez l'événement Showplan XML de la requête affectée.
Remarque
L'événement Showplan XML For Query Compile ne peut pas être utilisé. PlanGuideDB n'existe pas dans cet événement.
Si le repère de plan est de type OBJECT ou SQL, vérifiez que l'événement Showplan XML contient les attributs PlanGuideDB et PlanGuideName du repère de plan qui doit correspondre à la requête. Ou, dans le cas d'un repère de plan TEMPLATE, vérifiez que l'événement Showplan XML contient les attributs TemplatePlanGuideDB et TemplatePlanGuideName du repère de plan prévu. Cette opération vérifie que le repère de plan fonctionne. Ces attributs sont contenus sous l’élément <StmtSimple>> du plan.