sys.dm_exec_text_query_plan (Transact-SQL)

 

CETTE RUBRIQUE S’APPLIQUE À :ouiSQL Server (à partir de la version 2008)ouiAzure SQL DatabasenonAzure SQL Data WarehousenonParallel Data Warehouse

Retourne le plan d'exécution de requêtes au format texte pour un lot Transact-SQL ou pour une instruction spécifique dans le lot. Le plan de requête spécifié par le handle de plan peut être mis en cache ou en cours d’exécution. Cette fonction est similaire à sys.dm_exec_query_plan &#40 ; Transact-SQL &#41 ;, mais présente les différences suivantes :

  • La sortie du plan de requête est au format texte.

  • La taille de cette sortie n'est pas limitée.

  • Les instructions individuelles dans le traitement peuvent être spécifiées.

S’applique à: SQL Server (SQL Server 2008 et version actuelle), Base de données Azure SQL.

Topic link icon Conventions de la syntaxe Transact-SQL

  
sys.dm_exec_text_query_plan   
(   
    plan_handle   
    , { statement_start_offset | 0 | DEFAULT }  
        , { statement_end_offset | -1 | DEFAULT }  
)  

plan_handle
Identifie de façon univoque un plan de requête pour un traitement en cache ou en cours d'exécution. plan_handle est varbinary(64).

Le descripteur de plan peut être obtenu à partir des objets de gestion dynamiques suivants :

Sys.dm_exec_cached_plans

Sys.dm_exec_query_stats

Sys.dm_exec_requests

statement_start_offset | 0 | PAR DÉFAUT
Indique, en octets, la position de début de la requête que la ligne décrit dans le texte de son traitement ou de son objet persistant. statement_start_offset est int. La valeur 0 indique le début du traitement. La valeur par défaut est 0 :

Le décalage de début de l'instruction peut être obtenu à partir des objets de gestion dynamiques suivants :

Sys.dm_exec_query_stats

Sys.dm_exec_requests

statement_end_offset | -1 | PAR DÉFAUT
Indique, en octets, la position de fin de la requête que la ligne décrit dans le texte de son traitement ou de son objet persistant.

statement_start_offset est int.

La valeur -1 indique la fin du traitement. La valeur par défaut est -1.

Nom de colonneType de donnéesDescription
dbidsmallintID de la base de données de contexte qui était en fonction lorsque l'instruction Transact-SQL correspondant à ce plan a été compilée. Pour les instructions SQL ad hoc et préparées, l'ID de la base de données où les instructions ont été compilées.

Colonne acceptant la valeur NULL.
ObjectIDintID de l'objet (par exemple, procédure stockée ou fonction définie par l'utilisateur) pour ce plan de requête. Pour les traitements ad hoc et préparées, cette colonne est null.

Colonne acceptant la valeur NULL.
nombresmallintEntier servant à la numérotation des procédures stockées. Par exemple, un groupe de procédures pour la commandes application peut être nommée orderproc ; 1, orderproc ; 2, et ainsi de suite. Pour les traitements ad hoc et préparées, cette colonne est null.

Colonne acceptant la valeur NULL.
chiffrébitsIndique si la procédure stockée correspondante est chiffrée.

0 = Non chiffrée.

1 = Chiffrée.

Colonne n'acceptant pas la valeur NULL.
query_plannvarchar(max)Contient la représentation sous forme de plan d’exécution lors de la compilation du plan de l’exécution de requête est spécifié avec plan_handle. Le Showplan est au format texte. Un plan est généré pour chaque traitement contenant par exemple des instructions Transact-SQL ad hoc, des appels de procédures stockées et des appels de fonctions définies par l'utilisateur.

Colonne acceptant la valeur NULL.

Dans les conditions suivantes, aucune sortie Showplan est retournée dans le plan la colonne de la table retournée pour sys.dm_exec_text_query_plan:

  • Si le plan de requête est spécifié à l’aide de plan_handle a été supprimé du cache de plan, le query_plan colonne de la table retournée est null. Par exemple, cette condition peut se produire s’il existe un délai entre le moment où le descripteur de plan est capturé et lorsqu’il a été utilisé avec sys.dm_exec_text_query_plan.

  • Certaines instructions Transact-SQL ne sont pas mises en mémoire cache, par exemple les instructions d'opérations en bloc ou les instructions contenant des littéraux de chaîne dont la taille est supérieure à 8 Ko. Plans d’exécution de ces instructions ne sont pas accessibles à l’aide de sys.dm_exec_text_query_plan car ils n’existent pas dans le cache.

  • Si un Transact-SQL procédure stockée ou un lot contient un appel à une fonction définie par l’utilisateur ou un appel de code SQL dynamique, par exemple à l’aide de EXEC (chaîne), le compilés Showplan XML pour la fonction définie par l’utilisateur n’est pas incluse dans le tableau retourné par sys.dm_exec_text_query_plan pour la procédure stockée ou le lot. Vous devez procéder à un appel séparé à sys.dm_exec_text_query_plan pour la plan_handle qui correspond à la fonction définie par l’utilisateur.

Lorsqu’une requête ad hoc utilise un paramétrage simple ou forcé, les query_plan colonne contiendra uniquement le texte de l’instruction et pas le plan de requête. Pour retourner le plan de requête, appelez sys.dm_exec_text_query_plan pour le handle de plan de la requête paramétrable préparée. Vous pouvez déterminer si la requête a été paramétrée en référençant le sql colonne de la sys.syscacheobjects vue ou la colonne de texte de la sys.dm_exec_sql_text vue de gestion dynamique.

Pour exécuter sys.dm_exec_text_query_plan, un utilisateur doit être un membre de la sysadmin rôle serveur fixe ou disposer de l’autorisation VIEW SERVER STATE sur le serveur.

A. Récupération du plan de requête mis en mémoire cache pour un lot ou une requête Transact-SQL à exécution lente

Si une requête ou un traitement Transact-SQL s'exécute longtemps sur une connexion à SQL Server spécifique, récupérez le plan d'exécution de cette requête ou de ce traitement pour trouver la raison de ce retard. L'exemple suivant montre la récupération du plan d'exécution de requêtes pour une requête ou un traitement s'exécutant lentement.

System_CAPS_ICON_note.jpg Remarque


Pour exécuter cet exemple, remplacez les valeurs de session_id et plan_handle avec des valeurs spécifiques à votre serveur.

Récupérez tout d'abord à l'aide de la procédure stockée sp_who l'ID de processus serveur (SPID) pour le processus exécutant la requête ou le traitement.

USE master;  
GO  
EXEC sp_who;  
GO  

Le jeu de résultats renvoyé par sp_who indique que le SPID est 54. Vous pouvez utiliser cet Identificateur avec la sys.dm_exec_requests vue de gestion dynamique pour récupérer le descripteur de plan à l’aide de la requête suivante :

USE master;  
GO  
SELECT * FROM sys.dm_exec_requests  
WHERE session_id = 54;  
GO  

Le tableau retourné par sys.dm_exec_requests indique que le descripteur de plan pour la requête ou le lot à exécution lente est 0x06000100A27E7C1FA821B10600. L'exemple suivant retourne le plan de requête pour le descripteur de plan spécifié et utilise les valeurs par défaut 0 et -1 pour retourner toutes les instructions dans la requête ou le lot.

USE master;  
GO  
SELECT query_plan   
FROM sys.dm_exec_text_query_plan (0x06000100A27E7C1FA821B10600,0,-1);  
GO  
  

B. Récupération de chaque plan de requête à partir de la mémoire cache des plans

Pour récupérer un instantané de tous les plans de requête résidant dans le cache de plan, procurez-vous les descripteurs de tous les plans de requête dans le cache en interrogeant le sys.dm_exec_cached_plans vue de gestion dynamique. Les descripteurs sont stockés dans le plan_handle colonne de sys.dm_exec_cached_plans. Puis utilisez l’opérateur CROSS APPLY pour transmettre les descripteurs à sys.dm_exec_text_query_plan comme suit. Le plan d’exécution de sortie pour chaque plan actuellement dans le cache de plan se trouve dans le query_plan colonne de la table qui est retournée.

USE master;  
GO  
SELECT *   
FROM sys.dm_exec_cached_plans AS cp   
CROSS APPLY sys.dm_exec_text_query_plan(cp.plan_handle, DEFAULT, DEFAULT);  
GO  
  

C. Récupération de chaque plan de requête pour laquelle le serveur a regroupé des statistiques de requête du cache du plan

Pour récupérer un instantané de tous les plans de requête pour laquelle le serveur a regroupé des statistiques qui se trouvent actuellement dans le cache de plan, procurez-vous les descripteurs de ces plans dans le cache en interrogeant le sys.dm_exec_query_stats vue de gestion dynamique. Les descripteurs sont stockés dans le plan_handle colonne de sys.dm_exec_query_stats. Puis utilisez l’opérateur CROSS APPLY pour transmettre les descripteurs à sys.dm_exec_text_query_plan comme suit. La sortie du plan d'exécution de requêtes pour chaque plan est dans la colonne query_plan de la table retournée.

USE master;  
GO  
SELECT * FROM sys.dm_exec_query_stats AS qs   
CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, qs.statement_start_offset, qs.statement_end_offset);  
GO  
  

D. Récupération d’informations sur les cinq requêtes principales par temps processeur moyen

L'exemple suivant retourne les plans de requête et le temps processeur moyen pour les cinq premières requêtes. Le sys.dm_exec_text_query_plan fonction spécifie les valeurs par défaut 0 et -1 pour retourner toutes les instructions du lot dans le plan de requête.

SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],  
Plan_handle, query_plan   
FROM sys.dm_exec_query_stats AS qs  
CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, 0, -1)  
ORDER BY total_worker_time/execution_count DESC;  
GO  
  

Sys.dm_exec_query_plan &#40 ; Transact-SQL &#41 ;

Ajouts de la communauté

AJOUTER
Afficher: